2013-03-05 1 views
4

UICollectionView에 대한 사용자 정의 호출을 생성 중입니다. 바닥에있는 셀 중 일부는 화면 가장자리에 매달려 있습니다. 그러나 일반 페이지를 사용하면 다음 페이지로 스크롤하면 페이지 하단의 셀 절반 만 표시되는 경우에만 표시됩니다. 나머지 절반은 다음 페이지에 있습니다. 셀이 끝에서 멈추도록하고 싶지만 화면에 매달려있는 셀이 선명하게 보일 수 있도록 페이징을 중지하십시오.scrollViewWillEndDragging을 재정의 할 때 UICollectionView가 항상 감속을 움직이지는 않습니다.

그래서, 이렇게 나는 기능 오버라이드 - (무효) scrollViewWillEndDragging을 (있는 UIScrollView *)있는 ScrollView withVelocity : (CGPoint) 속도 targetContentOffset : (CGPoint *이 inout를)

내가 두 번째 또는 두 위해 드래그하면을 targetContentOffset , 예상대로 작동하는 것을 볼 수 있지만 페이징을 사용할 때 잘 작동하는 "플릭"을 모방하려고합니다. 내 UICollectionView를 가볍게 치기 만하면 움직이는 대신 targetContentOffset으로 점프합니다.

어떻게 방지합니까? 그것은 주어진 속도를 사용하기 때문에 그것은 targetContentOffset에 직접 '점프'

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { 

    if(targetContentOffset->y < 400) { 
     targetContentOffset->y = 0; 
     return; 
    } 

    int baseCheck = 400; 

    while(baseCheck <= 10000) { 
     if(targetContentOffset->y > baseCheck && targetContentOffset->y < baseCheck + 800) { 
      targetContentOffset->y = (baseCheck + 340); 
      return; 
     } 
     baseCheck += 800; 
    } 

    targetContentOffset->y = 0; 
} 

답변

2

:

여기 내 코드입니다. 플릭은 매우 빠른 속도입니다. 당신은 속도의 값을 확인하고해야하는 경우 (나는 생각하지만, 사용자가 조정할 수있는 2 주위) 다음은 간단한 [scrollView setContentOffset:contentOffset animated:YES];

5

와 애니메이션 자신 (I 같은 문제를 가로 질러 와서으로 관리 할 특정 속도보다 우수 내 경우에는 페이지 크기가 collectionView 자체의 크기보다 작은 페이지 매김 된 scrollView (실제로는 UICollectionView)를 시뮬레이트하고 있습니다. 스크롤의 '점프'가 특정 세트에서 발생한다는 것을 알아 챘습니다. 조건 :

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { 
    CGFloat pageWidth; // defined somewhere else 
    NSInteger numberOfPages; // depends on your dataSource 
    CGFloat proposedOffset = targetContentOffset->x; 
    NSInteger currentPage = roundf(self.collectionView.contentOffset.x/pageWidth); 
    NSInteger proposedPage = roundf(proposedOffset/pageWidth); 
    // what follows is a fix for a weird case where the scroll 'jumps' into place with no animation 
    if(currentPage == proposedPage) { 
     if((currentPage == 0 && velocity.x > 0) || 
      (currentPage == (numberOfPages - 1) && velocity.x < 0) || 
      (currentPage > 0 && currentPage < (numberOfPages - 1) && fabs(velocity.x) > 0) 
      ) { 
      // this forces the scrolling animation to stop in its current place 
      [self.collectionView setContentOffset:self.collectionView.contentOffset animated:NO]; 
      [UIView animateWithDuration:.3 
            delay:0. 
           options:UIViewAnimationOptionCurveEaseOut 
          animations:^{ 
           [self.collectionView setContentOffset:CGPointMake(currentPage * pageWidth, 0)]; 
          } 
          completion:NULL]; 
     } 
    } 
    targetContentOffset->x = (pageWidth * proposedPage); 
} 
관련 문제