我有一个非常大的水平滚动的UIScrollView,它正在重用其子视图(当它们超出可见区域时移动和更新它们,类似于UITableView重用单元格)。这依赖于scrollViewDidScroll:委托调用,它给我实际的contentOffset,然后我决定何时重用特定的子视图。到目前为止都很好。
有时我需要以自定义动画(惯性和反弹回最终位置)编程更改contentOffset。我可以使用核心动画轻松实现这一点。
问题是,在自定义动画期间,scrollViewDidScroll:委托方法不会被调用->我必须手动执行它,以便子视图重用起作用。我尝试使用每0.02秒触发一次的计时器来调用它。现在有两个问题:
1.我必须使用[[_scrollView.layer presentationLayer] bounds] .origin.x获取UIScrollView contentOffset,因为在动画期间正常的_scrollView.contentOffset不会改变。但是,presentationLayer中的信息对于精确同步不足够-有时会有点晚。
2.问题是当新的contentOffset远离当前位置时。它看起来像内置的UIScrollView动画是CAKeyframeAnimation,并且scrollViewDidScroll应该在关键帧位置上调用。但是我无法获得这些。
有人能否阐明UIScrollView在setContentOffset:X animated:YES期间何时以及如何调用scrollViewDidScroll?是否可能在不违反App Store规则的情况下重现它?
有时我需要以自定义动画(惯性和反弹回最终位置)编程更改contentOffset。我可以使用核心动画轻松实现这一点。
问题是,在自定义动画期间,scrollViewDidScroll:委托方法不会被调用->我必须手动执行它,以便子视图重用起作用。我尝试使用每0.02秒触发一次的计时器来调用它。现在有两个问题:
1.我必须使用[[_scrollView.layer presentationLayer] bounds] .origin.x获取UIScrollView contentOffset,因为在动画期间正常的_scrollView.contentOffset不会改变。但是,presentationLayer中的信息对于精确同步不足够-有时会有点晚。
2.问题是当新的contentOffset远离当前位置时。它看起来像内置的UIScrollView动画是CAKeyframeAnimation,并且scrollViewDidScroll应该在关键帧位置上调用。但是我无法获得这些。
有人能否阐明UIScrollView在setContentOffset:X animated:YES期间何时以及如何调用scrollViewDidScroll?是否可能在不违反App Store规则的情况下重现它?
CADisplayLink
的回调中调用-setNeedsLayout
或者你执行重用代码的任何方法。 - Christian Schnorr