检测UIScrollView是否滚动

我正在寻找检测是否(不是当) UIScrollView滚动。

 BOOL isScrolling = myscrollview.scrolling; 

我将如何去执行这个? 当使用setContentOffset:animated:时, .dragging.decelerating不适用。

这可能是一个稍微狡猾的做法,但我已经在我的代码之前使用它,它还没有让我失望。 🙂

 #import <QuartzCore/QuartzCore.h> --- BOOL isScrolling = [scrollView.layer animationForKey:@"bounds"] != nil; 

除了'self.contentOffset'之外,UIScrollView的偏移量也存储在UIView的“bounds.origin”属性中(我猜是因为它在低级代码中更方便一些)。 当你调用[setContentOffset:animated:]时,它会把它传递给UIScrollView作为CABasicAnimation,操作“bounds”属性。

当然,如果scrollView本身的形状是animation的,这个检查也会返回true。 在这种情况下,您可能需要将边界对象从animation([CAAnimation toValue])中拉出来,然后执行手动比较以查看“原点”本身是否正在改变。

这不是最优雅的解决scheme,但我喜欢能够避免必须尽可能使用委托。 特别是如果有问题的类是一个UIScrollView子类。 🙂

我通常通过在scrollViewWillBeginDragging:scrollViewDidEndDragging:willDecelerate: events中设置一个布尔variables来做到这一点。

UIScrollView文档

不是一个很干净的解决scheme..但应该是最可靠的:

 var isScrolling = false func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { isScrolling = true } func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { if !decelerate { scrollViewDidEndScrolling(scrollView) } } func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { scrollViewDidEndScrolling(scrollView) } func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { scrollViewDidEndScrolling(scrollView) } func scrollViewDidEndScrolling(_ scrollView: UIScrollView) { isScrolling = false } 
 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView; 

使用一个标志来保存当前的滚动状态? 它只能解决setContentOffset:animated:问题。

“滚动”只是一个效果,滚动视图“滚动”的方式有很多,例如连续设置内容偏移量。 所以这个问题应该没有答案。