2012-04-06 53 views
4

我想知道scrollView是向上還是向下滾動。理想情況下,如果scrollView向上或向下滾動,我只想要調用一次。我試過,但它顯然不會告訴我任何有關的方向:如何找出scrollView即將向上還是向下滾動

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { 
    NSLog(@"%.2f", scrollView.contentOffset.y); 
} 

contentOffset將始終爲0 - 沒關係我是否上下滾動時。現在我可以簡單地檢入 - (void)scrollViewDidScroll:如果偏移量是正數或負數,但是這會不斷調用。 scrollViewWillBeginDragging的優點是隻被調用一次,這就是我所需要的。有沒有像scrollViewDidBeginDragging?我沒有在文檔中找到任何內容。任何智能解決方法?

+1

如果用戶放下手指,開始向下滾動,然後改變主意並向上滾動,該怎麼辦? – 2012-04-06 17:46:47

+0

@JohnCalsbeek如果他滾動<0,那麼我需要取消當他滾動> 0時我調用的動作。 – 2012-04-06 17:53:18

回答

2

創建一個聲明的屬性讓我們知道tableview開始滾動。我們使用名爲scrollViewJustStartedScrolling的BOOL。

scrollViewWillBeginDragging其設置爲true:

self.scrollViewJustStartedScrolling = YES; 

scrollViewDidScroll做這樣的事情:

if (self.scrollViewJustStartedScrolling) { 
    // check contentOffset and do what you need to do. 
    self.scrollViewJustStartedScrolling = NO; 
} 
12

存儲初始內容scrollViewWillBeginDragging:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { 
    self.initialContentOffset = scrollView.contentOffset.y; 
    self.previousContentDelta = 0.f; 
} 

偏移,並檢查各scrollViewDidScroll:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    CGFloat prevDelta = self.previousContentDelta; 
    CGFloat delta = scrollView.contentOffset.y - self.initialContentOffset; 
    if (delta > 0.f && prevDelta <= 0.f) { 
     // started scrolling positively 
    } else if (delta < 0.f && prevDelta >= 0.f) { 
     // started scrolling negatively 
    } 
    self.previousContentDelta = delta; 
} 
+1

您不需要存儲initialContentOffset,因爲它始終爲0. – lnafziger 2012-04-06 18:03:12

+0

非常有意義。我忘記了所有關於想要在觸摸中改變主意的用戶。非常感謝。 – 2012-04-06 18:06:25

+1

@Inafziger'contentOffset'不是從滾動開始的偏移量,它是整個滾動視圖的偏移量。如果它在拖動開始時總是爲零,爲什麼我們會擔心可能會滾動? – 2012-04-06 18:06:40

4

IS可以註冊任何滾動前scrollViewWillBeginDragging進行此項檢查。 (IOS 5+)。通過檢查滾動視圖的內置平移手勢識別器,您可以檢查手勢方向。

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview]; 

    if(translation.y > 0) 
    { 
     // react to dragging down 
    } else 
    { 
     // react to dragging up 
    } 
} 

我發現它非常有用,用於在用戶拖動禁止方向時在首次拖動時取消滾動。

+1

**請注意,如果手勢過於微妙,翻譯可以返回零。**使用CGPoint速度= [scrollView.panGestureRecognizer velocityInView:scrollView.superview];'''來代替。 – Robert 2014-04-29 14:45:00

+0

此外請注意,如果您輕彈一個UIScrollView,然後在視圖仍然減速時觸摸並按住,scrollViewWillBeginDragging將以x = y = 0的平移和速度進行調用。所以最好不要假設'''else {...} '''將會'''向左拖動'''。確保零的平移/速度值。 – Robert 2014-04-29 19:26:54

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

    if (velocity.y > 0){ 
     NSLog(@"up"); 
    } else { 
     NSLog(@"down"); 
    } 
} 
相關問題