当用户用多个手指滑动scrollview时,缓慢停止,并没有触发这个代理方法:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView)
UICollectionView有3种停止滚动类型,分别是:
- 1、快速滚动,自然停止;
- 2、快速滚动,手指按压突然停止;
- 3、慢速上下滑动停止。
并没有一个回调能够正确识别所有的停止滑动。
UIScrollView有三个Bool类型属性:isTracking、isDragging、isDecelerating,在滚动和结束滚动时都有自己的值。
在3种动作触发的(DidEndDecelerating, DidEndDragging)两个方法中,isTracking、isDragging、isDecelerating 的Bool值分别为:
停止类型1:
DidEndDecelerating: isTracking:0, isDragging:0, isDecelerating:0
停止类型2:
DidEndDragging: isTracking:1, isDragging:0, isDecelerating:1
DidEndDecelerating: isTracking:0, isDragging:0, isDecelerating:0
停止类型3:
DidEndDragging: isTracking:1, isDragging:0, isDecelerating:0
具体实现如下:
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
//停止类型1、停止类型2
let scrollToScrollStop = !scrollView.isTracking && !scrollView.isDragging && !scrollView.isDecelerating
if scrollToScrollStop {
self.scrollViewDidEndScroll()
}
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
//停止类型3
let dragToDragStop = scrollView.isTracking && !scrollView.isDragging && !scrollView.isDecelerating
if dragToDragStop {
self.scrollViewDidEndScroll()
}
}
//停止滑动事件
func scrollViewDidEndScroll() {
}