检测UIScrollView是否正在滚动

时间:2012-12-10 07:59:17

标签: ios

我想要检测UIScrollView是否(不是何时)滚动。

BOOL isScrolling = myscrollview.scrolling;

我将如何实施此功能? <{1}}和.dragging在使用.decelerating时不适用。

4 个答案:

答案 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:事件中设置布尔变量来实现此目的。

UIScrollView Docs

答案 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。

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