2

在 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
                     }];
}
4

4 回答 4

2

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

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

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

于 2013-10-27T15:13:08.473 回答
1

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

于 2013-02-27T12:32:23.353 回答
1

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

于 2016-12-26T07:14:57.307 回答
-1

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

是的。摆脱“layoutSubviews”方法并在另一种方法中为子视图设置变换。

[self.parentView setUpChildrenViews];
...
[self.parentView animate];
于 2013-02-27T11:38:47.103 回答