【问题标题】:iOS: Animate subview without calling layoutSubviewsiOS:动画子视图而不调用 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
                     }];
}

【问题讨论】:

    标签: ios objective-c uiview core-animation uiviewanimation


    【解决方案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];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多