有没有办法通过重用视图的 UIScrollView 上的核心动画来更改内容偏移?

Posted

技术标签:

【中文标题】有没有办法通过重用视图的 UIScrollView 上的核心动画来更改内容偏移?【英文标题】:Is there a way to change content offset via Core Animation on UIScrollView with reusing views? 【发布时间】:2012-04-17 14:01:57 【问题描述】:

编辑:我取得了一些进展,所以我简化并缩小了问题: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,而是在动画的开头和结尾调用了其他一些委托方法,这是我不想要的。 【参考方案1】:

通过here查看我的答案。

编辑:哈哈,刚刚发现是同一个作者

【讨论】:

【参考方案2】:

您可以尝试在方法中更改滚动偏移量,然后您可以从中调用它

    [self performSelector:<#(SEL)#> withObject:<#(id)#> afterDelay:<#(NSTimeInterval)#>];

然后让它在达到特定值时停止

【讨论】:

以上是关于有没有办法通过重用视图的 UIScrollView 上的核心动画来更改内容偏移?的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 不工作(不能滚动)

有没有办法将雪花视图标记为“安全”以便结果重用?

如何在UIScrollView上进行UIButton修复?

IOS开发之代码之九宫格

在触摸期间停止 UIScrollView 滚动

UITableViewCell 中的 UIScrollview 和维护滚动视图页面