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

Vil*_*urz 6 cocoa-touch core-animation uiscrollview cakeyframeanimation ios

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

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

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

Chr*_*orr 4

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


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