UITableView、UICollectionView 滾動結束的監測

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

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

}code

UICollectionView有3種中止滾動類型,分別是:一、快速滾動,天然中止;二、快速滾動,手指按壓忽然中止;三、慢速上下滑動中止。blog

 

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

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView

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

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

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

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

在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的中止滾動。top

 

具體實現以下:di

 

#pragma mark - UIScrollDelegate

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    // 中止類型一、中止類型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 {

}
相關文章
相關標籤/搜索