我正在寻找检测是否(而不是何时) aUIScrollView
正在滚动。
IE
BOOL isScrolling = myscrollview.scrolling;
我将如何实施呢?.dragging
使用时.decelerating
不适用setContentOffset:animated:
。
我正在寻找检测是否(而不是何时) aUIScrollView
正在滚动。
IE
BOOL isScrolling = myscrollview.scrolling;
我将如何实施呢?.dragging
使用时.decelerating
不适用setContentOffset:animated:
。
编辑:自iOS 14以来,此方法似乎已停止工作。我会尝试看看是否可以找到替代方法,如果可以,我将更新此答案。
这可能是一种有点狡猾的方式,但我以前在我的代码中使用过它,它还没有让我失望。:)
迅速
let isScrolling = scrollView.layer.animation(forKey: "bounds") != nil
Objective-C
BOOL isScrolling = [scrollView.layer animationForKey:@"bounds"] != nil;
除了self.contentOffset
a 的偏移量UIScrollView
也存储在 the 的bounds.origin
属性中UIView
(我猜是因为它在较低级别的代码中更方便一些)。当您调用 时[setContentOffset:animated:]
,它会将其传递给UIScrollView
as CABasicAnimation
,从而操纵bounds
属性。
当然,如果滚动视图本身的形状正在动画,则此检查也将返回 true。在这种情况下,您可能需要实际将边界对象拉出动画 ( [CAAnimation toValue]
) 并进行手动比较以查看origin
其自身是否发生了变化。
这不是最优雅的解决方案,但我喜欢尽可能避免使用滚动视图委托。特别是如果有问题的滚动视图可能是一个子类,它显式地将其委托作为其公共 API 的一部分出售。:)
不是一个非常干净的解决方案..但应该是最可靠的:
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
}
我通常通过在scrollViewWillBeginDragging:
和scrollViewDidEndDragging:willDecelerate:
事件中设置一个布尔变量来做到这一点。
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;
使用标志来保存当前的滚动状态?它只能解决 setContentOffset:animated: 问题。
“滚动”只是一种效果,有很多方法可以使滚动视图“滚动”,例如连续设置内容偏移量。所以这个问题应该没有答案。