检测UIScrollView是否正在滚动

Jon*_*nny 16 ios

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

BOOL isScrolling = myscrollview.scrolling;
Run Code Online (Sandbox Code Playgroud)

我将如何实现这一目标?.dragging并且.decelerating在使用时不适用setContentOffset:animated:.

TiM*_*TiM 16

这可能是一种略微狡猾的方式,但我之前在我的代码中使用过它并没有让我失望.:)

#import <QuartzCore/QuartzCore.h>
---
BOOL isScrolling = [scrollView.layer animationForKey:@"bounds"] != nil;
Run Code Online (Sandbox Code Playgroud)

除了'self.contentOffset'之外,UIScrollView的偏移量也存储在UIView的"bounds.origin"属性中(我想因为它在低级代码中更方便一些).当你调用[setContentOffset:animated:]时,它将它作为CABasicAnimation传递给UIScrollView,操纵"bounds"属性.

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

这不是最优雅的解决方案,但我希望能够避免在任何可能的情况下使用代理.特别是如果有问题的类是UIScrollView子类.:)

  • 看起来它在 iOS 14 中不起作用 `scrollView.layer.animationKeys` 没有给我任何东西 (3认同)
  • @Cy-4AH 啊你是对的!我也测试并证实了!嗯,好吧。我会考虑一下这个问题,看看是否能想出任何潜在的替代检查方法。 (2认同)

Ech*_*lon 7

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

UIScrollView文档


Rok*_*rič 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
}
Run Code Online (Sandbox Code Playgroud)