iOS的UIScrollView滚动监测
在scrollView上面嵌套tableView的时候,有时需要监测tableview的滚动动画是否结束,再决定是否更新数据源,刷新界面,但是苹果并没有直接提供出这样的API出来,而scrollView的delegate里面,看起来也只有那么几个好像可以的!~
// 这个代理表示手指离开了scrollView,第二个参数用于判断滚动速度是否正在下降。
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
// 这个方法觉得像是停止减速。但是从注释上,“called when scroll view grinds to a halt”---> 突然停止的时候才会被调用,而我们要的是“自然停止”时被调起的方式。
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
// 这个是指scrollView停止滚动动画的时候调用,但是debug的时候会发现怎么滑动都没有跑进来啊!!除非是手动调用scrollViewDidEndScrollingAnimation···
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView; // called when setContentOffset scrollRectVisible:animated: finishes. not called if not animating
发现
因为业务需要,在每次滚动完全结束后才去刷新数据,包括了手动拖拽和点击两种情况的滚动,为了避免滚动过程中持续发送通知于是需要得到已经结束滚动切换到另一个界面时发送,便找到了个方式
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
当走进这个代理后,创建一个异步调用并且0.1S后手动调用scrollViewDidEndScrollingAnimation。为了避免循环调用,需要触发时取消上次的异步请求,等到不再滚动的时候,则不取消请求,这个时候滚动动画也已经结束了,然后在scrollViewDidEndScrollingAnimation去实现想要停止时调用的逻辑就可以了。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
///设置按钮
[self choseSelectedButton];
[NSObject cancelPreviousPerformRequestsWithTarget:self];
[self performSelector:@selector(scrollViewDidEndScrollingAnimation:) withObject:nil afterDelay:0.1];
}
///停止滚动触发delegate
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
[NSObject cancelPreviousPerformRequestsWithTarget:self];
DebugLog(@"停止滚动 index %ld",self.pageIndex);
}
关键性代码也就是上面的那两个方法,停止后想要进行的操作,就在第二个里面进行就是可以了。