當用戶用多個手指滑動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 { }