2010-04-29 2 views
2

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

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

ответ

6

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

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

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

2

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

Matt Gallagher имеет blog post, который описывает решение этой конкретной проблемы. Я использовал его, и он отлично работает.

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

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

+0

неточная ссылка. Вот правильный вариант: http://cocoawithlove.com/2009/01/multiple-virtual-pages-in-uiscrollview.html – jcayzac

Смежные вопросы