使用自动布局做动画,就是通过更改控件的frame来实现动画,但是不能直接更改frame,可以更改控件的约束关系来实现,其注意事项如下:
自动布局的页面实现动画效果需要注意
1.不能够直接修改frame,可能会引起自动布局系统计算错误
2.直接修改视图的约束关系.自动布局系统会根据约束关系 自动计算空间的frame 在layoutSubViews方法中计算视图的frame
3.每一次运行循环开启时 自动布局系统都会 '收集' 所有页面视图的约束的修改 不会立即更新约束
在运行循环结束前 会自动调用 layoutsubViews方法 修改所有子视图的frame
4.如果希望提前更新约束 需要强制刷新页面 self.view.layoutIfNeeded() 需要在动画的闭包中执行 并且 一定要在修改约束之后调用
使用举例:使用第三方库Masonry来约束控件,在相应的控制器.m文件中实现方法viewDidAppear,其中self.iconView self.welcomeLabel是控制器view的两个子控件,具体实现动画方法如下:
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
CGFloat offset = - [UIScreen mainScreen].bounds.size.height + 150;
self.welcomeLabel.alpha = 0;
// 弹簧系数(SpringWithDamping) * 10 ~= 加速度(SpringVelocity) 这个时候动画效果一般不会太突兀
[UIView animateWithDuration:0.5 delay:0 usingSpringWithDamping:0.98 initialSpringVelocity:9.8 options:0
animations:^{
//对于已经存在的约束 如果需要进行修改可以使用mas_update 不存在该约束 就会自动创建约束
[self.iconView mas_updateConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(self.view.mas_bottom).offset(offset);
}];
//强制刷新页面 将收集的所有的约束的更改 都执行页面 frame刷新
[self.view layoutIfNeeded];
self.welcomeLabel.alpha = 1;
} completion:^(BOOL finished) {
}];
}
注意:动画的实现一般在- (void)viewDidAppear:(BOOL)animated方法中实现