iOS:Animate子视图而不调用layoutSubviews

时间:2013-02-26 10:06:45

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

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

有没有好办法(没有bool标志)来处理这种行为?

示例:

- (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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

  

有没有好办法(没有bool标志)来处理这种行为?

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

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