Разрыв между страницами в приложении для фотографий в UIScrollView с помощью pagingEnabled

Вы также можете использовать HTML5 replaceState, если хотите изменить URL-адрес, но не хотите добавлять запись в историю браузера:

if (window.history.replaceState) {
   //prevents browser from storing history with each change:
   window.history.replaceState(statedata, title, url);
}

Это «сломало» функциональность кнопки «Назад». Это может потребоваться в некоторых случаях, например, в галерее изображений (где вы хотите, чтобы обратная кнопка возвращалась обратно на индексную страницу галереи, вместо того чтобы перемещаться по каждому просматриваемому вами изображению), предоставляя каждому изображению свой собственный уникальный URL.

23
задан Andrey Tarantsov 11 May 2009 в 20:43
поделиться

6 ответов

Обратите внимание, что это довольно старый ответ. Основная концепция все еще работает, но вам не следует жестко программировать размеры представлений в iOS7 и 8. Даже если вы игнорируете этот совет, вам не следует использовать 480 или 330.

Пробовали ли вы сделать рамку UIScrollView немного больше, чем экран (предполагая, что вы хотите отображать изображения в полноэкранном режиме, а затем расположите свои подвиды на те же границы немного больше, чем экран.

#define kViewFrameWidth 330; // i.e. more than 320

CGRect scrollFrame;
scrollFrame.origin.x = 0;
scrollFrame.origin.y = 0; 
scrollFrame.size.width = kViewFrameWidth;
scrollFrame.size.height = 480;

UIScrollView* myScrollView = [[UIScrollView alloc] initWithFrame:scrollFrame];
myScrollView.bounces = YES;
myScrollView.pagingEnabled = YES;
myScrollView.backgroundColor = [UIColor redColor];

UIImage* leftImage = [UIImage imageNamed:@"ScrollTestImageL.png"];
UIImageView* leftView = [[UIImageView alloc] initWithImage:leftImage];
leftView.backgroundColor = [UIColor whiteColor];
leftView.frame = CGRectMake(0,0,320,480);

UIImage* rightImage = [UIImage imageNamed:@"ScrollTestImageR.png"];
UIImageView* rightView = [[UIImageView alloc] initWithImage:rightImage];
rightView.backgroundColor = [UIColor blackColor];
rightView.frame = CGRectMake(kViewFrameWidth * 2,0,320,480);

UIImage* centerImage = [UIImage imageNamed:@"ScrollTestImageC.png"];
UIImageView* centerView = [[UIImageView alloc] initWithImage:centerImage];
centerView.backgroundColor = [UIColor grayColor];
centerView.frame = CGRectMake(kViewFrameWidth,0,320,480);

[myScrollView addSubview:leftView];
[myScrollView addSubview:rightView];
[myScrollView addSubview:centerView];

[myScrollView setContentSize:CGSizeMake(kViewFrameWidth * 3, 480)];
[myScrollView setContentOffset:CGPointMake(kViewFrameWidth, 0)];

[leftView release];
[rightView release];
[centerView release];

Приносим извинения, если это не компилируется, я протестировал его в приложении с альбомной ориентацией и вручную отредактировал его обратно в портретное положение. Я уверен, что вы поняли идею. полагается на отсечение супервизора, которое всегда будет иметь место для полноэкранного просмотра.

27
ответ дан 29 November 2019 в 01:12
поделиться

Это всего лишь догадка, поэтому извиняюсь, если она полностью неверна, но возможно ли, что contentSize просто установлен немного шире, чем ширина экрана.

Правильная информация затем отображается внутри вид на ширину экрана, а UIScrollView позаботится обо всем остальном?

0
ответ дан 29 November 2019 в 01:12
поделиться

Maybe you want to try UIScrollView's contentInset property?

myScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 10.0);
0
ответ дан 29 November 2019 в 01:12
поделиться

Как вы сказали, это можно сделать из нескольких вещей.

Если вы хотите, чтобы между изображениями был зазор в 20 пикселей, вам необходимо:

Во-первых, увеличьте общую ширину вашей прокрутки на 20 пикселей и переместите ее на 10 пикселей влево.

Во-вторых, когда вы размещаете xLoc ваших изображений, добавьте 20 пикселей для каждого изображения, чтобы они располагались на расстоянии 20 пикселей друг от друга. В-третьих, установите начальный xLoc ваших изображений на 10 пикселей вместо 0 пикселей.

В-четвертых, убедитесь, что вы установили размер содержимого прокрутки, чтобы добавить 20 пикселей для каждого изображения. Итак, если у вас есть изображения kNumImages, и каждое из них - kScrollObjWidth, тогда вы выполните следующее:

[scrollView setContentSize:CGSizeMake((kNumImages * (kScrollObjWidth+20)),  kScrollObjHeight)];

После этого все должно работать!

4
ответ дан 29 November 2019 в 01:12
поделиться

Итак, у меня недостаточно «представителя», чтобы оставить комментарий к ответу выше. Этот ответ правильный, но есть БОЛЬШАЯ проблема, о которой следует знать:

Если вы используете UIScrollView в viewController, который является частью UINavigationController, контроллер навигации БУДЕТ изменять размер рамки вашего scrollView.

Это То есть у вас есть приложение, которое использует UINavigationController для переключения между различными представлениями. Вы нажимаете viewController, у которого есть scrollView, и создаете этот scrollView в методе viewController -init. Вы назначаете ему фрейм (0, 0, 340, 480).

Теперь перейдите к методу viewController -viewDidAppear, получите фрейм созданного вами scrollView. Вы обнаружите, что ширина уменьшена до 320 пикселей. Таким образом, разбиение на страницы не будет работать правильно. Вы' Я ожидаю, что scrollView переместится на 340 пикселей, но вместо этого он переместится на 320.

UINavigationController несколько печально известен тем, что возится с подпредставлениями. Он перемещает их и изменяет их размер в соответствии с навигационной панелью. Короче говоря, это не командный игрок - особенно в этом случае. В других местах в Интернете предлагается не использовать UINavigationController, если вам нужен точный контроль над размером и расположением ваших представлений. Вместо этого они предлагают создать собственный класс navigationController на основе UINavigationBar.

Что ж, это огромная работа. К счастью, есть более простое решение: установите рамку scrollView в методе viewController -viewDidAppear. На этом этапе UINavigationController закончил возиться с фреймом, поэтому вы можете сбросить его до того, каким он должен быть, и scrollView будет вести себя правильно.

Это актуально для OS 3.0. Я не тестировал 3.1 или 2.2.1. Я также отправил отчет об ошибке в Apple, предлагая, чтобы они изменили UINavigationController с помощью BOOL, такого как «-shouldAutoarrangeSubviews», чтобы мы могли заставить этот класс уберечь свои грязные руки от подпредставлений.

Пока это не произойдет, вышеупомянутое исправление будет давать вам пробелы в разбитом на страницы UIScrollView в UINavigationController.

22
ответ дан 29 November 2019 в 01:12
поделиться

Apple выпустила видео сессий WWDC 2010 для всех участников программы для разработчиков iphone. Одна из обсуждаемых тем - как они создали приложение для фотографий !!! Они шаг за шагом создают очень похожее приложение и сделали весь код доступным бесплатно.

Он также не использует частный API. Вот ссылка на загрузку примера кода. Вам, вероятно, потребуется войти в систему, чтобы получить доступ.

http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?code=y&source=x&bundleID=20645

И вот ссылка на страницу iTunes WWDC:

​​http://insideapple.apple.com/redir/cbx-cgi.do?v=2&la=en&lc=&a=kGSol9sgPHP%2BtlWtLp%2BEP%2FnxnZarjWJglPBZRHd3oDbACudP51JNGS8KlsFgxZto9X%2BTsnqSbeUSWX0doe%2Fzv%2FN5XV55%2FomsyfRgFBysOnIVggO%2Fn2p%2BiweDK%2F% 2FmsIXj

7
ответ дан 29 November 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: