iOS:动画子视图而不调用 layoutSubviews

Posted

技术标签:

【中文标题】iOS:动画子视图而不调用 layoutSubviews【英文标题】:iOS: Animate subview without calling layoutSubviews 【发布时间】:2013-02-26 10:06:44 【问题描述】:

在 layoutSubviews 中,我将我的子视图布局到适当的位置,并为其中一些应用一些转换。现在我想在这个子视图上制作可重复的比例动画来引起注意。但是,当我使用 [UIView animate....] 启动动画时,会更改变换属性 - 触发 layoutSubviews 方法,该方法与动画冲突(它会覆盖变换并且未播放动画)。

有什么好的方法(没有布尔标志)来处理这种行为吗?

例子:

- (void)layoutSubviews 
    [super layoutSubviews];
    myChildView.transform = CGAffineTransformMake....;


- (void)animate 
    CGAffineTransform originalTransform = myChildView.transform;
    [UIView animateWithDuration:0.1f
                          delay:0.0f
                        options:UIViewAnimationOptionAutoreverse
                     animations:^
                         [UIView setAnimationRepeatCount:4];
                         //next line of code produce calling layoutSubviews
                         myChildView.transform = CGAffineTransformMakeScale(1.15f, 1.15f);
                      completion:^(BOOL finished)
                         myChildView.transform = originalTransform; 
                         //after this also called layoutSubviews
                     ];

【问题讨论】:

【参考方案1】:

最近,我遇到了这个问题。我重写了视图控制器内部的方法viewDidLayoutSubviews 来控制动画。

- (void)viewDidLayoutSubviews 
     // This method will be called after subview's layoutSubviews.
     if (self.shouldAnimated) 
        // Do animation at here.
     

但是,这只是一个肮脏的解决方案。

【讨论】:

【参考方案2】:

我建议你最好不要使用 layoutSubviews。而是在 init 方法或从 init 调用的自定义方法中创建、定位和转换您的子视图。

【讨论】:

【参考方案3】:

我也遇到了这个问题。我添加另一个视图(称为 subView)作为子视图,并将 myChildView 添加到 subView。当我更改 myChildView 的变换时,这不会触发 superview 的 layoutSubviews。为什么,你可以看到这个UIView/CALayer: Transform triggers layoutSubviews in superview。

【讨论】:

【参考方案4】:

有什么好的方法(没有布尔标志)来处理这种行为吗?

是的。去掉“layoutSubviews”方法,用另一种方法为子视图设置变换。

[self.parentView setUpChildrenViews];
...
[self.parentView animate];

【讨论】:

以上是关于iOS:动画子视图而不调用 layoutSubviews的主要内容,如果未能解决你的问题,请参考以下文章

pushviewcontroller 动画而不实际调用 pushviewcontroller

iOS 动画视图,包括子视图

如果父视图正在动画,则 IOS7 子视图会被动画

iOS - 子视图不使用帧更改进行动画处理

iOS 使用动画块转换视图

IOS / Autolayout可能只用于顶视图而不设置子视图?