【发布时间】:2024-01-24 08:05:01
【问题描述】:
编辑:我取得了一些进展,所以我简化并缩小了问题:I have created new question, which is more clearer and more understandable I hope
我有非常大的水平滚动 UIScrollView,它正在重用它的子视图。当用户向左滚动时,最右边的视图移动到最左边的位置并更新其内容。同样,当用户向右滚动时,最左边的视图会移动到最右边的位置并更新其内容。与 UITableView 类似。这可以很好地使用 scrollviewDidScroll: 委托方法。
现在我需要以编程方式更改偏移量,但要使用自定义动画行为(惯性和弹回最终位置)。
为了原型,我使用
[UIView animateWithDuration:contentOffsetCADuration
delay:0
options:UIViewAnimationOptionCurveLinear
animations:^{
[self setContentOffsetNoDelegateCalls:contentOffset animated:NO];
}
completion:^(BOOL finish){
dispatch_async(dispatch_get_main_queue(), ^{
[timer invalidate];
});
}];
我使用禁用的委托回调对内容偏移进行动画处理,以便在动画期间不会弄乱视图。但我需要一些东西来同时重用和重新定位它们。
我的解决方案是创建计时器并手动调用scrollViewDidScroll:,以便像往常一样重复使用,与动画平行。但它根本不起作用 - 没有任何东西被重用,并且动画之后的滚动视图的内容与动画之前的状态相同 -> 以前可见的页面被移出屏幕。
所以问题缩小了如何在动画期间移动子视图并更新其内容?
或者也许有完全不同的方式来做到这一点......
【问题讨论】:
-
不确定我是否理解 - “所以动画期间视图不会混乱”,然后是“如何移动子视图......在动画期间”的问题。为什么不调用 setContentOffset:animated: ?然后调用 scrollViewDidScroll,然后像往常一样重新定位子视图?
-
是的,但我需要自定义动画。我实际上已经继承了 UIScrollView,并覆盖了 setContentOffset:animated:。如果动画是肯定的,我需要执行核心动画自定义动画。问题是,在这个自定义动画期间,我无法重用子视图。
-
当您在动画块中执行 setContentOffset:animated: 时,不会调用 viewDidScroll,而是在动画的开头和结尾调用了其他一些委托方法,这是我不想要的。
标签: iphone ios cocoa-touch uiscrollview core-animation