【问题标题】:Is there a way to change content offset via Core Animation on UIScrollView with reusing views?有没有办法通过重用视图的 UIScrollView 上的核心动画来更改内容偏移?
【发布时间】: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


【解决方案1】:

通过here查看我的答案。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      最近更新 更多