我想要检测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子类.:)
我通常通过在scrollViewWillBeginDragging:
和scrollViewDidEndDragging:willDecelerate:
events中设置一个布尔变量来做到这一点.
不是一个很干净的解决方案..但是应该是最可靠的:
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)
归档时间: |
|
查看次数: |
16419 次 |
最近记录: |