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