2013-12-18 63 views
1

我有一個水平的UIScrollView,我需要這個滾動視圖被分頁。但問題是,我還需要一個非頁面UIScrollView的「慣性」效應。我一直在谷歌搜索和stackoverflow的一段時間,沒有運氣。帶有「慣性」但已分頁的UIScrollView。

任何想法或線索,所以我可以開始閱讀如何執行此任務?

謝謝!

+0

你想如何工作?如果你刷卡的速度非常快,你是否希望它滾動一會兒,而不停在下一頁? – Macondo2Seattle

+0

就是這樣,但是當它停止時,我希望它停止在頁面中。 – Andres

+0

做這樣的事很容易,但可能需要一些努力才能讓它感覺正確。我認爲你需要完全或部分覆蓋減速曲線,所以它停在你想要的地方。 – Macondo2Seattle

回答

3

如果分頁被禁用,滾動視圖將拖動結束時調用您的委託。使用-scrollViewWillEndDragging:withVelocity:targetContentOffset:方法(iOS 5和更高版本),您可以確定基於慣性的目標,並更改傳入的值以對其進行修改。例如,代理中的這段代碼將更改目標,以便滾動視圖會自動減速到其邊界大小的倍數。

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
        withVelocity:(CGPoint)velocity 
       targetContentOffset:(CGPoint *)targetContentOffset { 
    CGSize pageSize = scrollView.bounds.size; 
    targetContentOffset->x = pageSize.width * 
     round(targetContentOffset->x/pageSize.width); 
    targetContentOffset->y = pageSize.height * 
     round(targetContentOffset->y/pageSize.height); 
} 
+0

向您表示感謝的唯一方法是說:「我愛你」。這工作得很好,我正在考慮做更困難的事情!謝謝!!!! – Andres

0

我想到了一個使用scrollViewDelegate方法的解決方案:scrollViewDidScroll。在該方法中,我只在滾動速度小於某個值時檢查速度並應用分頁,因此它會保持慣性。我不使用UIScrollView的普通分頁,而是調用setContentOffset方法,以便我可以在正確的時間應用分頁。該代碼可能看起來過於複雜,但您可以將其分成更小的方法並使其看起來更好。玩兩個常數,看看什麼效果最好。希望它至少能幫助你朝正確的方向發展。

馬蒂亞斯

#define SPEED_MIN = 2 
#define SPEED_MAX = 10 

{ 
    CGFloat prevX; 
    BOOL dragging; 
    NSInteger page; 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    CGFloat nextX = scrollView.contentOffset.x; 
    CGFloat speedX = nextX - prevX; 
    speedX = (speedX < 0 ? -speedX : speedX); 
    prevX = nextX; 

    if (dragging) 
    { 
     if (speedX < SPEED_MIN && page < 0) 
     { 
      page = [self getClosestPage:scrollView]; 
      [scrollView setContentOffset:CGPointMake(page * scrollView.frame.size.width, 0) animated:YES]; 
      [scrollView setScrollEnabled:NO]; 
     } 
     else if (scrollView.contentOffset.x == page * scrollView.frame.size.width) 
     { 
      page = -1; 
      dragging = false; 
      [scrollView setScrollEnabled:YES]; 
     } 
    } 
    else 
    { 
     dragging = speedX > SPEED_MAX; 
    } 
} 
- (NSInteger)getClosestPage:(UIScrollView *)scrollView 
{ 
    CGFloat x = scrollView.contentOffset.x; 
    CGFloat w = scrollView.frame.size.width; 
    NSInteger nbrOfPages = scrollView.contentSize.width/w; 
    for (int i = 0; i < nbrOfPages; i++) { 
     CGFloat dx1 = x - i*w; 
     CGFloat dx2 = (i+1)*w - x; 
     if (dx1 > 0 && dx2 > 0) { 
      if (dx1 >= dx2) { 
       return i; 
      } else { 
       return (i+1 < nbrOfPages ? i+1 : i); 
      } 
     } 
    } 
    return 0; 
} 
+0

感謝您的幫助! – Andres