我想要检测UIScrollView
是否(不是何时)滚动。
即
BOOL isScrolling = myscrollview.scrolling;
我将如何实施此功能? <{1}}和.dragging
在使用.decelerating
时不适用。
答案 0 :(得分:16)
这可能是一种略微狡猾的方式,但我之前在我的代码中使用过它并没有让我失望。 :)
#import <QuartzCore/QuartzCore.h>
---
BOOL isScrolling = [scrollView.layer animationForKey:@"bounds"] != nil;
除了'self.contentOffset'之外,UIScrollView的偏移量也存储在UIView的“bounds.origin”属性中(我想因为它在低级代码中更方便一些)。当你调用[setContentOffset:animated:]时,它将它作为CABasicAnimation传递给UIScrollView,操纵“bounds”属性。
当然,如果scrollView本身的形状是动画,则此检查也将返回true。在这种情况下,您可能需要实际将边界对象拉出动画([CAAnimation toValue])并进行手动比较以查看“origin”本身是否发生了变化。
这不是最优雅的解决方案,但我希望能够避免在任何可能的情况下使用代理。特别是如果有问题的类是UIScrollView子类。 :)
答案 1 :(得分:6)
我通常通过在scrollViewWillBeginDragging:
和scrollViewDidEndDragging:willDecelerate:
事件中设置布尔变量来实现此目的。
答案 2 :(得分:5)
不是一个非常干净的解决方案..但应该是最可靠的:
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
}
答案 3 :(得分:0)
locationManager.startUpdatingLocation()
使用标志来保存当前滚动状态? 它只能解决setContentOffset:animated:problem。
“滚动”只是一种效果,有很多方法可以使滚动视图“滚动”,例如连续设置内容偏移量。所以这个问题应该没有答案。