我想检测 UIScrollView
是否(不是何时)正在滚动。
即
BOOL isScrolling = myscrollview.scrolling;
我将如何着手实现它? .dragging
和 .decelerating
在使用 setContentOffset:animated:
时不适用。
最佳答案
编辑:自 iOS 14 以来,此方法似乎已停止工作。我会尝试看看是否可以找到替代方法,如果找到,我会更新此答案。
这可能是一种有点狡猾的做法,但我以前在我的代码中使用过它,而且它还没有让我失望。 :)
swift
let isScrolling = scrollView.layer.animation(forKey: "bounds") != nil
objective-C
BOOL isScrolling = [scrollView.layer animationForKey:@"bounds"] != nil;
除了 self.contentOffset
之外,UIScrollView
的偏移量存储在 UIView< 的
以及(我猜是因为它在较低级别的代码中更方便一些)。当您调用 bounds.origin
属性中[setContentOffset:animated:]
时,它会将其作为 CABasicAnimation
传递给 UIScrollView
,从而操纵 bounds
属性。
当然,如果 ScrollView 本身的形状是动画的,这个检查也将返回 true。在这种情况下,您可能需要实际将边界对象拉出动画 ([CAAnimation toValue]
) 并进行手动比较以查看 origin
本身是否发生了变化.
这不是最优雅的解决方案,但我喜欢能够尽可能避免使用 ScrollView 委托(delegate)。特别是如果所讨论的 ScrollView 可能是一个子类,将其委托(delegate)作为其公共(public) API 的一部分显式出售。 :)
关于ios - 检测 UIScrollView 是否在滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13797005/