UITableView、UICollectionView 滾動結束的監測


當用戶用多個手指滑動scrollview時,緩慢停止,並沒有觸發這個代理方法:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

}

UICollectionView有3種停止滾動類型,分別是:1、快速滾動,自然停止;2、快速滾動,手指按壓突然停止;3、慢速上下滑動停止。

 

第1種類型在UIScrollView 的Delegate可檢測:

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView

但第2、第3種卻沒有暴露方法供使用,但會觸發Delegate:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

繼續分析,UIScrollView有三個Bool類型屬性:tracking、dragging、decelerating,在滾動和結束滾動時都有自己的值。

在3種動作觸發的兩個方法中,tracking、dragging、decelerating 的Bool值分別為:

停止類型1:DidEndDecelerat:0,dragging:0,decelerating:0

停止類型2:DidEndDragging:tracking:1,dragging:0,decelerating:1

         DidEndDecelerat:tracking:0,dragging:0,decelerating:0

停止類型3:DidEndDragging:tracking:1,dragging:0,decelerating:0

上面三種動作結束后,只要捕捉到tracking、dragging、decelerating的1個組合即可監測到UICollectionView的停止滾動。

 

具體實現如下:

 

#pragma mark - UIScrollDelegate

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    // 停止類型1、停止類型2
    BOOL scrollToScrollStop = !scrollView.tracking && !scrollView.dragging &&    !scrollView.decelerating; 
    if (scrollToScrollStop) {
       [self scrollViewDidEndScroll];
    }
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    if (!decelerate) {
       // 停止類型3
       BOOL dragToDragStop = scrollView.tracking && !scrollView.dragging && !scrollView.decelerating;
       if (dragToDragStop) {
          [self scrollViewDidEndScroll];
       }
  }
}

#pragma mark - scrollView 停止滾動監測
- (void)scrollViewDidEndScroll {

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM