很多时候我们在对父 View 做动画的时候,子 View 也需要相应的动画。
对于使用自动布局的项目来说,只要子 View 是使用约束来布局的,其实对这种情况是天生支持的。比如下面的两个 View
UIView *superView = [[UIView alloc] init];
UIView *subView = [[UIView alloc] init];
[superView addSubview:subView];
[subView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(superView);
}];
如果出现不能动画的情况,只需要检查一下几个点就行:
检查 autoresizesSubviews 属性
@interface UIView(UIViewGeometry)
...
@property(nonatomic) BOOL autoresizesSubviews; // default is YES. if set, subviews are adjusted according to their autoresizingMask if self.bounds changes
...
@end
我们可以看到,autoresizesSubviews 这个属性是用于确定View在边界更改时是否自动调整其子视图的大小,默认其实是 YES 的。不需要特别修改。
如果需要子视图不随父视图动画,可以修改该属性为 NO。
检查动画代码,是否重新计算布局
这是最容易导致子视图无法动画的地方。我们在动画时,只修改了父视图的属性,却忽略了子视图,导致子视图没有计算布局,也就导致子视图没有跟随动画了。
需要在动画前后调用 layoutIfNeeded 方法重新计算布局。
如下面简单的一个大小修改动画。
// 修改 superView 的大小
superView.frame = CGRectMake(0, 0, 300, 300);
// 一定要使用 layoutIfNeeded 计算子 View 布局。否则子 View 无法跟随动画
[superView layoutIfNeeded];
[UIView animateWithDuration:0.3 animations:^{
superView.frame = CGRectMake(0, 0, 50, 50);
[superView layoutIfNeeded];
}];