gpt4 book ai didi

iphone - 带有自定义 layoutSubviews 的 UIScrollView 不再动画

转载 作者:行者123 更新时间:2023-12-01 19:22:09 25 4
gpt4 key购买 nike

我有一个 UIScrollView 的子类,用于图像幻灯片,具有无限滚动和圆形幻灯片。

我曾经以这种方式为过渡设置动画:(因为我希望过渡更慢)

[UIView animateWithDuration:1.0 
delay:0 options:(UIViewAnimationCurveEaseOut)
animations:^{
self.scrollView.contentOffset = newOffset;}
completion:NULL];

它工作得很好。

然后我看了 WWDC 2011 的讲座“高级滚动技术”,他们建议通过覆盖 layoutSubviews 来实现无限滚动。 .

所以我改变了我的实现并覆盖了 layoutSubviews
一旦我这样做了,过渡动画就停止工作了。

如果我注释掉我的自定义 layoutSubviews - 它又可以工作了!

为什么??

在覆盖 layoutSubviews 时,我该怎么做才能制作自己的滚动动画?

谢谢!

最佳答案

好的,我想我发现了问题,并且可能解决了这个问题。

理解问题的关键是理解当你打电话

[UIView animateWithDuration...]

您在动画块内更改的所有属性都会更改 立即 .它们不会随着动画实际执行(视觉上)而改变。

所以就我而言,我将 contentOffset 动画化为我的目标值。
此操作会立即调用 layoutSubviews。

在我的 layoutSubviews 实现中,我正在检查是否已经积累了足够的移动。如果是这样 - 我正在重新排列我的 ImageViews, 并将 contentOffset 设置为其初始值 .一旦我这样做了,就没有任何动画了,因为什么都没有改变!
  • 将 contentOffset 动画化为 X:
  • 调用 setContentOffset 到 X:
  • 调用 layoutSubview
  • 将 contentOffset 设置回 Y! (重新排列 View 后)
  • 在这一点上没有动画...

  • 可能的修复

    我不确定这是否是正确的方法,但它的工作原理。
    所以我们需要做的是确保当我们处于动画块中间时,layoutSubviews 不会发生任何变化。

    所以我创建了一个名为 isAnimating 的 BOOL 实例变量,并在动画块中适本地设置它:
    self.isAnimating = YES;
    [UIView animateWithDuration:self.transitionDuration
    delay:0
    options:(UIViewAnimationOptionCurveEaseOut)
    animations:^{
    self.contentOffset = newOffset;
    }

    completion:^(BOOL finished) {
    self.isAnimating = NO;
    [self setNeedsLayout];
    }];

    现在在 layoutSubviews 中我们需要考虑 isAnimating:
    -(void) layoutSubviews
    {
    [super layoutSubviews];
    if (self.isAnimating == NO)
    {
    [self rearrangeIfNecessary];
    }
    }

    它又开始工作了!

    关于iphone - 带有自定义 layoutSubviews 的 UIScrollView 不再动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9786869/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com