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

Ios 如何调用scrollViewDidScroll:与UIScrollView的调用方式相同,但在自定义动画期间如何调用?,ios,cocoa-touch,uiscrollview,core-animation,cakeyframeanimation,Ios,Cocoa Touch,Uiscrollview,Core Animation,Cakeyframeanimation,我有一个非常大的水平滚动的UIScrollView,它正在重用它的子视图(当它们不在可见区域时移动并更新它们,类似于UITableView正在重用单元格)。这依赖于scrollViewDidScroll:delegate调用,它给出了实际的contentOffset,在这里我决定何时重用特定的子视图。到目前为止还不错 有时我需要通过编程更改contentOffset,但需要自定义动画(惯性和反弹到最终位置)。我可以很容易地用核心动画做到这一点 问题是,在自定义动画scrollViewDidScr

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

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

问题是,在自定义动画scrollViewDidScroll:delegate方法期间未调用->我必须手动执行此操作,以便子视图重用工作。我尝试调用它,计时器每0.02秒触发一次。现在有两个问题:

  • 我必须使用[[U scrollView.layer presentationLayer]bounds].origin.x获取UIScrollView内容偏移量,因为在动画期间,正常的[U scrollView.contentOffset]不会更改

    然而,presentationLayer提供的信息不足以进行精确同步-有时会有点晚

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

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


  • 在setContentOffset:X动画:是的过程中,有人能解释UIScrollView调用scrollViewDidScroll的确切方式和时间吗?有没有可能在不违反appstore规则的情况下复制它?

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



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

    非常感谢,现在的同步效果好多了。但仍然存在一个问题:当滚动到长距离时,视图重用没有赶上滚动的速度。按触摸事件(用户正在滚动)快速滚动时也会发生同样的情况。当我停止使用表示层进行位置跟踪、用户滚动时,即使是最快的滚动也会恢复平滑。所以,询问表示层似乎有点慢。有没有办法像默认行为那样,在滚动期间强制UIScrollView更新contentOffset?这可能会加快速度。对不起,我应该告诉你:在你的
    CADisplayLink
    的回调调用
    -setNeedsLayout
    中,或者任何你执行重用代码的方法中。是的,我在回调中调用scrollViewDidScroll:。明天我将尝试在instruments中分析性能问题所在。您正在setNeedsLayout中执行重用?是的。当您仍然有问题时,可以给我发电子邮件(请参阅我的个人资料),这样我们就不必继续讨论了吗?解决方法是在CADisplayLink回调中调用setContentOffset:X。偏移X是时间反馈到动画函数的结果。每个setContentOffset调用scrollViewDidScroll:delegate方法与显示帧速率完全同步。这正是UIScrollView在引擎盖下的工作方式。非常感谢Jenox为我指明了正确的方向。