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的主要内容,如果未能解决你的问题,请参考以下文章