20

我正在寻找检测是否(而不是何时) aUIScrollView正在滚动。

IE

BOOL isScrolling = myscrollview.scrolling;

我将如何实施呢?.dragging使用时.decelerating不适用setContentOffset:animated:

4

4 回答 4

23

编辑:自iOS 14以来,此方法似乎已停止工作。我会尝试看看是否可以找到替代方法,如果可以,我将更新此答案。


这可能是一种有点狡猾的方式,但我以前在我的代码中使用过它,它还没有让我失望。:)

迅速

let isScrolling = scrollView.layer.animation(forKey: "bounds") != nil

Objective-C

BOOL isScrolling = [scrollView.layer animationForKey:@"bounds"] != nil;

除了self.contentOffseta 的偏移量UIScrollView也存储在 the 的bounds.origin属性中UIView(我猜是因为它在较低级别的代码中更方便一些)。当您调用 时[setContentOffset:animated:],它会将其传递给UIScrollViewas CABasicAnimation,从而操纵bounds属性。

当然,如果滚动视图本身的形状正在动画,则此检查也将返回 true。在这种情况下,您可能需要实际将边界对象拉出动画 ( [CAAnimation toValue]) 并进行手动比较以查看origin其自身是否发生了变化。

这不是最优雅的解决方案,但我喜欢尽可能避免使用滚动视图委托。特别是如果有问题的滚动视图可能是一个子类,它显式地将其委托作为其公共 API 的一部分出售。:)

于 2013-03-25T16:29:21.227 回答
8

不是一个非常干净的解决方案..但应该是最可靠的:

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
}
于 2017-05-22T13:16:05.327 回答
7

我通常通过在scrollViewWillBeginDragging:scrollViewDidEndDragging:willDecelerate:事件中设置一个布尔变量来做到这一点。

UIScrollView 文档

于 2012-12-10T08:03:53.483 回答
0
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;

使用标志来保存当前的滚动状态?它只能解决 setContentOffset:animated: 问题。

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

于 2017-01-22T03:59:01.940 回答