先看效果:
动画说明:
这个简单动画的实质就是三个视图之间及三个视图与父视图之间的距离由10到100的重复不断的变化。
代码说明:
将需要做动画的约束保存起来:
[self.animatableConstraints addObjectsFromArray:@[
make.edges.equalTo(superview).insets(paddingInsets).priorityLow(),
make.bottom.equalTo(blueView.mas_top).offset(-padding),
]];
子视图添加之后,设置动画标记为YES,并调用动画方法,传入参数NO,表示初始状态是由10->100,而不是由100->10:
- (void)didMoveToWindow {
[self layoutIfNeeded];
if (self.window) {
self.animating = YES;
[self animateWithInvertedInsets:NO];
}
}
- (void)willMoveToWindow:(UIWindow *)newWindow {
self.animating = newWindow != nil;
}
实现动画:
- (void)animateWithInvertedInsets:(BOOL)invertedInsets {
// 动画标记为NO,不执行动画
if (!self.animating) return;
// 如果是反向,则间距为100;如果不是,则使用当前记录的值
int padding = invertedInsets ? 100 : self.padding;
// 设置新的间距给约束
UIEdgeInsets paddingInsets = UIEdgeInsetsMake(padding, padding, padding, padding);
for (MASConstraint *constraint in self.animatableConstraints) {
constraint.insets = paddingInsets;
}
// 执行动画
[UIView animateWithDuration:1 animations:^{
[self layoutIfNeeded];
} completion:^(BOOL finished) {
//repeat!
[self animateWithInvertedInsets:!invertedInsets];
}];
}