2010-04-29 5 views
2

내 iPhone 앱에는 최대 200 개의 하위 뷰 (150 x 150)를 포함 할 수있는 스크롤 뷰 pagingEnabled=NO이 있으며 도전 과제는 지연로드를 수행하고 수평으로 끝이없는 스크롤링 (튀어 오름)을 시뮬레이트하는 것입니다. 지도.Objective-C : pagingEnabled가없는 끝이없는 UIScrollView

이 요청에 대한 해결책이 있습니까?

답변

6

스크롤 뷰의 지연로드는 Apple의 샘플 코드 프로젝트 중 하나 인 PageControl에서 증명됩니다.

끝없는 스크롤을 가짜로 만들려면 스크롤보기를 매우 넓게 만드는 것이 좋습니다. 평균적인 사람보다 넓은 스크롤 동작 세트에서 스크롤하는 것이 좋습니다. 그런 다음 대리자 메서드 -scrollViewDidEndScrollingAnimation:, -scrollViewDidEndDragging:willDecelerate:-scrollViewDidEndDecelerating: (사용자가 스크롤을 마친 후에 하나 이상의 뷰어가 호출 됨)에서 스크롤 뷰 가운데에 콘텐츠가 위치하도록 위치를 바꾸고 애니메이션 처리하지 않고 contentOffset 포인트를 업데이트합니다.

시각적으로 작동하려면 수평 스크롤러를 비활성화해야합니다. 또한 contentOffset.x을 스크롤 뷰의 경계로 더 이상 나눌 수 없기 때문에 특정 방법으로 어떤 뷰를 그릴 것인지 결정할 방법을 고려해야합니다. contentOffset.

2

안녕하세요. 방법을 찾았습니다. 나는 모든 하위 뷰를 가진 마스터 배열을 가지고있다 (내 경우에는 이미지이므로 이름을 저장한다). scrollview에는 left, current, right의 세 가지 하위보기 만 있습니다. 페이징을 사용할 수 있으므로 사용자는 언제든지 한 번에 하나의보기를 왼쪽/오른쪽으로 돌릴 수 없습니다. 내가하는 일 : 1) 마스터 배열에서 현재 위치를 추적합니다. 그가 왼쪽으로 움직인다면 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) 사용자가 이동 한 후에, I는 다음과 같이, 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

매트 갤러거이 정확한 문제에 대한 해결책을 설명하는 blog post 있습니다. 나는 그것을 사용했고 그것은 훌륭하게 작동합니다.

Cocoa Touch의 UIScrollView 및 UIPageControl은 여러 패닝 페이지가있는 사용자 인터페이스를 허용합니다. Apple에서 제공하는 샘플 프로젝트 (PageControl)는 지연로드 된 배열의 모든 페이지에 대한 모든 하위 뷰를 유지합니다. 얼마나 많은 가상 페이지를 표현하고자하든 관계없이 두 개의 하위 뷰를 사용하여 구현할 수있는 방법을 설명하겠습니다.

하위보기를 뒤적 거리며 필요에 따라 내용을 재설정하여 작동합니다. 나는 플래시 카드를 보여주기 위해 이것을 사용했다. 3 ~ 3,000 개의 아이템이있을 수있다. 지금은 페이징을 위해 설정되었지만 정기적 인 스크롤로 작업 할 수 있다고 확신합니다.

+0

잘못된 링크. 다음은 올바른 것입니다 : http://cocoawithlove.com/2009/01/multiple-virtual-pages-in-uiscrollview.html – jcayzac