2012-11-23 5 views
2

많은 하위 뷰를 표시하기 위해 UIScrollView를 사용하고 있습니다.UIScrollView에서 pagingEnabled를 YES로 설정하는 이유는 하위 뷰를 터치 할 때 자동으로 이전 페이지로 스크롤됩니까?

ScrollView = [[UIScrollView alloc]initWithFrame:CGRectZero]; 
ScrollView.delegate = self; 
ScrollView.showsHorizontalScrollIndicator = NO; 
ScrollView.showsVerticalScrollIndicator = NO; 
ScrollView.clipsToBounds = YES; 
ScrollView.scrollEnabled = YES; 
ScrollView.pagingEnabled = YES; 

CGFloat widthOfScroll= (maxTotalColumnsVisibleAtAnyPoint * widthOfSubView); 

ScrollView.frame = CGRectMake(0, 0, widthOfScroll, heightOfSubView); 

CGSize contentSizeHeaderView = self.ScrollView.frame.size; 
CGFloat contentSizeWidth = self.totalSubViews * self.widthOfSubView; 
contentSizeHeaderView.width = contentSizeWidth; 

[ScrollView setContentSize:contentSizeHeaderView]; 

있는 ScrollView하고있는 ScrollView에 대한 이벤트 처리기에 컨트롤을 추가하는 코드는 다음과 같습니다 :

-(void)loadControlsInScroll{ 


    UIView *tempSubView = nil; 
    CGFloat tempOriginX = 0; 
    @autoreleasepool { 


     for (int i = 0; i < self.totalSubViews; i++) { 


      tempSubView = [dataSource viewForScroll:i]; 
      tempSubView.layer.borderColor = borderColor.CGColor; 
      tempSubView.layer.borderWidth = kBorderWidth; 
      tempSubView.frame = CGRectMake(tempOriginX, 0, widthOfSubView, heightOfSubView); 
      tempOriginX = tempOriginX + widthOfSubView; 

      [self.ScrollView addSubview:tempSubView]; 
     } 

    } 

} 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
///Event handler 
} 

것은 나는이 스크롤 뷰에 페이징을 사용하도록 설정 한 : 다음 스크롤 뷰를 생성하는 코드입니다.

max scrollView에서 프레임에 8 개의 하위보기를 저장할 수 있다고 가정 해 보겠습니다.

CASE 1

16 파단이있는 ScrollView에 첨가된다. 이제 두 페이지가 표시됩니다. 두 페이지 모두를 올바르게 스크롤하고 있습니다. 두 페이지의 하위보기를 만지면 잘못된 동작이 발생하지 않습니다.

CASE 2

9 파단 스크롤 뷰에 추가된다. 지금은 또한 그것은 견인차입니다. 첫 번째 페이지에는 1 ~ 8 번째 하위보기가 포함됩니다. 2 페이지에는 2 ~ 9 번째 하위보기가 있습니다. 1 페이지의 하위보기를 만지면 정상적으로 작동합니다. 2 페이지에서 언급하면 ​​UIScrollView의 이벤트 핸들러 scrollViewDidScroll이 호출됩니다.

enter image description here

enter image description here

추가 정보 :

  1. PagingEnabled가 NO로 설정되어있는 경우이 발생하지 않습니다.

수동으로 스크롤을하지 않아도이 scrollViewDidScroll 이벤트가 호출되는 이유는 무엇입니까? 이 시간에 이벤트 핸들러 scrollViewWillBeginDragging도 호출됩니까?

UPDATE 1 :

진짜 문제는 PagingEnabled가 YES이면,있는 ScrollView의 대리인 설정되지 않거나 다음 여부, 케이스 (2)에있어서, 스크롤 뷰 자동 이전 페이지로 스크롤한다는 것이다.

+0

업데이트 된 항목 – Krishnan

답변

5

UIScrollView의 Paginenabled 속성은 항상 scrollview를 해당 범위의 너비로 스크롤합니다. 따라서 9 개의 하위보기가있는 경우 두 번째 페이지로 스크롤하여 2-9 개 하위보기를 표시합니다. 실제 페이지 1에는 하위보기 1-8이 있고 두 번째 하위 페이지에는 9 개의 하위보기 만 있습니다. 따라서 실제 문제는 UIScrollview의 콘텐츠 너비가 페이지 수에 비례해야한다는 것입니다. 귀하의 1 페이지에 8 개의 하위보기가 있습니다. 콘텐츠 크기는 이어야합니다. UIScrollview의 너비 * 아니요. 페이지 수 9.보기 당신을 데려 갈 것이다 다시 스크롤하면 1-8 서브 뷰 다시 당신을 데려 갈 것이다 첫 페이지에 스크롤이 방법으로

// noOfpages = No of pages in scrollview (Each page has 8 subviews) 
// noOfSubviews 
int noOfpages = 
if(noOfSubviews%8==0){ 
    noOfPages = noOfSubviews/8; 

}else{ 
    noOfPages = noOfSubviews/8 + 1; 
} 
scrollview.contentSize = CGSizeMake(scrollview.frame.size.width*noOfPages,scrollview.frame.size.height); 

.