【问题标题】:UIScrollView with custom layoutSubviews does not animate anymore具有自定义 layoutSubviews 的 UIScrollView 不再动画
【发布时间】:2012-04-04 22:10:40
【问题描述】:

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

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

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

而且效果很好。

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

所以我改变了我的实现并覆盖了layoutSubviews

一旦我这样做了,过渡动画就停止工作了。

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

为什么??

如何在覆盖 layoutSubviews 的同时制作自己的滚动动画?

谢谢!

【问题讨论】:

  • 我想这将是“要么这个/要么那个”的决定。如果将动画代码移至layoutSubviews,会发生什么(可能不推荐...)?
  • @rokjarc 我想我找到了问题(和解决方案)...发布答案

标签: iphone ios uiscrollview uikit layoutsubviews


【解决方案1】:

好的,我想我找到了问题所在,并找到了可能的解决方法。

理解问题的关键是理解当你调用时

[UIView animateWithDuration...]

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

所以在我的例子中,我将 contentOffset 设置为我的目标值。 此操作立即调用 layoutSubviews。

在我的 layoutSubviews 实现中,我正在检查是否累积了足够的移动。如果是这样 - 我正在重新排列我的 ImageView,并将 contentOffset 设置为其初始值。一旦我这样做了,就没有什么动画了,因为什么都没有改变!

  1. 动画内容偏移到 X:
    • 将 setContentOffset 调用到 X:
      • 调用布局子视图
        • 将 contentOffset 设置回 Y! (重新排列视图后)
    • 此时没有可设置动画的内容...

可能的修复

我不确定这是否是正确的方法,但它可以正常工作。 所以我们需要做的是确保我们在动画块中间时不会对 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];
    }
}

它又开始工作了!

【讨论】:

    猜你喜欢
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2014-02-07
    相关资源
    最近更新 更多