Objective-C: бесконечный UIScrollView без pagingEnabled

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

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


person Daniel    schedule 29.04.2010    source источник


Ответы (3)


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

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

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

person Ashley Clark    schedule 29.04.2010

Привет, я нашел способ сделать это. У меня есть главный массив со всеми подпредставлениями (в моем случае это изображения, поэтому я сохраняю имена). Scrollview имеет только 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)];

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

Гонсо

person gonso    schedule 02.05.2010

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

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

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

person Michael Grinich    schedule 03.07.2010
comment
неправильная ссылка. Вот правильный: cocoawithlove.com/2009/01/ - person jcayzac; 18.09.2011