如何调用scrollViewDidScroll:与UIScrollView相同,但在自定义动画期间?

我有一个非常大的水平滚动UIScrollView,它重用它的子视图(当它们超出可见区域时移动和更新它们,类似于UITableView重用单元格)。 这依赖于scrollViewDidScroll:委托调用,它给了我实际的contentOffset,在这里我决定何时重用特定的子视图。 到现在为止还挺好。

有时我需要以编程方式更改contentOffset,但需要使用自定义动画(惯性并弹回到最终位置)。 我可以使用核心动画很容易地做到这一点。

问题是,在自定义动画期间,不调用scrollViewDidScroll:delegate方法 – >我必须手动执行,以便重用子视图。 我试着用定时器每次发射0.02秒来调用它。 现在有两个问题:

  1. 我必须使用[[_scrollView.layer presentationLayer] bounds] .origin.x获取UIScrollView contentOffset,因为在动画期间,正常的_scrollView.contentOffset不会改变。

    但是,来自presentationLayer的信息不足以进行精确同步 – 有时候会有点迟。

  2. 问题是当新的contentOffset远离当前位置时。 看起来内置的UIScrollView动画是CAKeyframeAnimation,而应该在关键帧位置调用scrollViewDidScroll。 但我无法得到这些。

    如果我依赖于与关键帧同步的计时器,则会在错误的位置重复使用视图,而在动画期间我根本看不到它们。

任何人都可以了解一下UConcrollView在setContentOffset期间如何以及何时调用scrollViewDidScroll:X animated:YES? 是否可以在不破坏appstore规则的情况下重现它?

首先,我不会使用延迟为0.02秒的NSTimer – 这不是定时器的假设。 尝试使用CADisplayLink ,每帧触发一次。


在您的回调方法中,您可以 – 如果您的自定义动画正在运行 – 运行您自己的物理代码并分别调用-setContentOffset:animated:。 这甚至可以让您以指数方式轻松放松哪些CA不会让您失望。