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

时间:2012-04-18 12:57:30

标签: ios cocoa-touch uiscrollview core-animation cakeyframeanimation

我有一个非常大的水平滚动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应该在关键帧位置上调用。但我无法得到这些。

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

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

1 个答案:

答案 0 :(得分:4)

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


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