Ios 如何调用scrollViewDidScroll:与UIScrollView的调用方式相同,但在自定义动画期间如何调用?
我有一个非常大的水平滚动的UIScrollView,它正在重用它的子视图(当它们不在可见区域时移动并更新它们,类似于UITableView正在重用单元格)。这依赖于scrollViewDidScroll:delegate调用,它给出了实际的contentOffset,在这里我决定何时重用特定的子视图。到目前为止还不错 有时我需要通过编程更改contentOffset,但需要自定义动画(惯性和反弹到最终位置)。我可以很容易地用核心动画做到这一点 问题是,在自定义动画scrollViewDidScroll:delegate方法期间未调用->我必须手动执行此操作,以便子视图重用工作。我尝试调用它,计时器每0.02秒触发一次。现在有两个问题:Ios 如何调用scrollViewDidScroll:与UIScrollView的调用方式相同,但在自定义动画期间如何调用?,ios,cocoa-touch,uiscrollview,core-animation,cakeyframeanimation,Ios,Cocoa Touch,Uiscrollview,Core Animation,Cakeyframeanimation,我有一个非常大的水平滚动的UIScrollView,它正在重用它的子视图(当它们不在可见区域时移动并更新它们,类似于UITableView正在重用单元格)。这依赖于scrollViewDidScroll:delegate调用,它给出了实际的contentOffset,在这里我决定何时重用特定的子视图。到目前为止还不错 有时我需要通过编程更改contentOffset,但需要自定义动画(惯性和反弹到最终位置)。我可以很容易地用核心动画做到这一点 问题是,在自定义动画scrollViewDidScr
在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为我指明了正确的方向。