【发布时间】:2012-04-29 21:23:58
【问题描述】:
我有一个非常大的水平滚动 UIScrollView,它正在重用其子视图(当它们超出可见区域时移动和更新它们,类似于 UITableView 正在重用单元格)。这依赖于 scrollViewDidScroll: 委托调用,它给了我实际的 contentOffset,在这里我决定何时重用特定的子视图。到目前为止一切顺利。
有时我需要以编程方式更改 contentOffset,但需要使用自定义动画(惯性和弹回最终位置)。使用核心动画我可以很容易地做到这一点。
问题是,在自定义动画期间,scrollViewDidScroll: 委托方法未被调用 -> 我必须手动执行,以便子视图重用工作。 我尝试通过每 0.02 秒触发一次的计时器来调用它。现在有两个问题:
-
我必须使用 [[_scrollView.layer presentationLayer] bounds].origin.x 获取 UIScrollView contentOffset,因为在动画期间正常 _scrollView.contentOffset 不会改变。
但是,presentationLayer 提供的信息不足以进行精确同步 - 有时会有点晚。
-
问题是当新的 contentOffset 远离当前位置时。看起来内置的 UIScrollView 动画是 CAKeyframeAnimation,并且应该在关键帧位置上调用 scrollViewDidScroll。但我无法得到这些。
如果我依赖不与关键帧同步的计时器,视图会在错误的位置重复使用,我在动画期间根本看不到它们。
谁能解释一下 UIScrollView 在 setContentOffset:X animated:YES 期间究竟是如何以及何时调用 scrollViewDidScroll 的?是否可以在不违反应用商店规则的情况下重现它?
【问题讨论】:
标签: ios cocoa-touch uiscrollview core-animation cakeyframeanimation