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