ios - 检测 UIScrollView 是否在滚动

标签 ios

我想检测 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/

相关文章:

ios - 具有 3 个部分的 PFQueryTableViewController

ios - 使用 pod 时,isKindOfClass 在目标之间不匹配

ios - 圆形 UIButton - iPad 尺寸

ios - iOS 应用程序的背景在测试时未加载

ios - UITableViewCell 中所有自动布局约束的缩进

ios - 如何在 iOS 7 中控制表格部分标题的缩进?

ios - .addTarget 方法将操作添加到 UITextView

iOS - NSTimeZone 的 3 个字母时区缩写

ios - 如何将 NSString 放入具有多个参数的 NSLog

ios - 在 iOS 7 下的“设置”应用程序中包含许可文本的正确方法是什么?