Objective-C: бесконечный UIScrollView без pagingEnabled - PullRequest
2 голосов
/ 29 апреля 2010

В моем приложении для iPhone есть просмотр прокрутки pagingEnabled=NO, который может содержать до 200 подпредставлений (150 x 150), и задача состоит в том, чтобы выполнять отложенную загрузку и моделировать бесконечную прокрутку (без отскока) в горизонтальных направлениях.

Есть ли решение или альтернатива для этого запроса?

Ответы [ 3 ]

6 голосов
/ 29 апреля 2010

Ленивая загрузка представления прокрутки демонстрируется в одном из примеров проектов кода Apple: PageControl .

Чтобы подделать бесконечную прокрутку, я бы предложил сделать ваш вид прокрутки очень широким для начала, шире, чем обычный человек прокручивал бы в одном наборе режимов прокрутки. Затем в ваших методах делегатов -scrollViewDidEndScrollingAnimation:, -scrollViewDidEndDragging:willDecelerate: и -scrollViewDidEndDecelerating:, один или несколько из которых будут вызваны после того, как пользователь выполнит прокрутку, измените положение своего контента в центре представления прокрутки и обновите свой contentOffset точка без анимации.

Для того, чтобы это работало визуально, вам также необходимо отключить горизонтальную прокрутку. Вам также нужно будет подумать, как определить, какой вид рисовать в конкретном contentOffset с помощью этого метода, поскольку вы больше не сможете просто делить contentOffset.x на границы вида прокрутки, чтобы узнать, где вы находитесь.

2 голосов
/ 03 мая 2010

Здравствуйте, я нашел способ сделать это. У меня есть мастер-массив со всеми подпредставлениями (в моем случае это изображения, поэтому я храню имена). У прокрутки есть только 3 подпредставления: левое, текущее и правое. Пейджинг включен, поэтому пользователь не может вращать больше одного вида влево / вправо в любое время. Что я делаю это: 1) отслеживать его текущую позицию на главном массиве. Если он двигается влево, вычтите один; правильно добавь. Как это:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
  [some code to determine current page, based on contentOffset]
    if (page == 0){
        NSLog(@"Going left");
        if (currentPage > 0){
            currentPage--;
        } else {
            //cycle to last
            currentPage = [images count] -1;
        }
    } else if (page == 2){
        NSLog(@"Going right");
        if (currentPage < ([images count] -1)){
            currentPage++;
        } else {
            //cycle to first
            currentPage = 0;
        }
    } else{
        NSLog(@"Not moving");
    }

2) после перемещения пользователя я перезагружаю 3 новых изображения, например:

//updates the 3 views of the scrollview with a new center page.
-(void) updateScrollViewForIndex:(NSInteger)newCenterPage{
    //fist clean scroll view
    for (UIView *sView in [scroll subviews]){
        [sView removeFromSuperview];
    }

    NSInteger imgCount = [images count];

    //set center view
    [self loadImageIndex:newCenterPage atPosition:1];

    //set left view
    if (newCenterPage > 0){
        [self loadImageIndex:newCenterPage-1 atPosition:0];

    } else {
        //its the first image, so the left one is the last one
        [self loadImageIndex:imgCount-1 atPosition:0];
    }

    //set right view
    if (newCenterPage < imgCount-1){
        [self loadImageIndex:newCenterPage+1 atPosition:2];
    } else {
        //its the last image, so ther right one is the first one
        [self loadImageIndex:0 atPosition:2];       
    }
}

3) Наконец, повторно отцентрируйте вид прокрутки к центру снова:

[scroll setContentOffset:CGPointMake(1 * viewWidth, 0)];

Надеюсь, это поможет, хотя "человек с планом" - мистер Кларк, который указал путь.

Gonso

1 голос
/ 03 июля 2010

Мэтт Галлахер имеет сообщение в блоге , в котором описывается решение именно этой проблемы. Я использовал его, и он прекрасно работает.

UIScrollView и UIPageControl в Cocoa Touch позволяют создавать пользовательские интерфейсы с несколькими панорамирующими страницами. Пример проекта, который предоставляет Apple (PageControl), сохраняет все дочерние представления для каждой страницы в лениво загруженном массиве. Я покажу вам, как вы можете реализовать это, используя только два дочерних представления, независимо от того, сколько виртуальных страниц вы хотите представить.

Он работает, перетасовывая дочерние представления и сбрасывая их содержимое при необходимости. Я использовал это для отображения флеш-карт, где может быть от 3 до 3000 предметов. Хотя он настроен прямо сейчас для подкачки страниц, я уверен, что вы могли бы заставить его работать с обычной прокруткой.

...