UIView类的块动画类方法都可以比较方便的实现动画效果
UIView animateWithDuration
那么,有人想过怎么停止块动画么.
举个例子.我们给UIViewController的View添加一个View然后给他做动画
UIView *view = [UIView new];
view.backgroundColor = [UIColor redColor];
[self.view addSubview:view];
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.sizeOffset(CGSizeMake(40, 40));
make.left.offset(0);
make.bottom.equalTo(self.mas_bottomLayoutGuide);
}];
[self.view layoutIfNeeded];
// ->到这里布局完毕,下面是动画有关代码
[view mas_remakeConstraints:^(MASConstraintMaker *make) {
make.size.sizeOffset(CGSizeMake(100, 100));
make.right.offset(0);
make.bottom.equalTo(self.mas_bottomLayoutGuide);
}];
[UIView animateWithDuration:10 animations:^{
[self.view layoutIfNeeded];
}
我们可以发现,动画是完美的执行了.那么 ,如何停止他呢.
我们知道UIView封装的是CALayer,CALayer也有他的动画属性(也有些自带动画).那么说不定翻翻CALayer能翻到停止动画的属性.(CALayer里头的removeAnimationForKey:因为没key还是用不了)
- (void)removeAllAnimations;
写完之后动画就没了.直接就是remake后的布局.为了验证动画确确实实被我们停掉了我们来写个延时代码验证一下.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 4), dispatch_get_main_queue(), ^{
[view.layer removeAllAnimations];
});
可以看到执行了4秒动画后,动画被停掉了.那么,我们怎么才能知道动画是执行完毕还是执行到一半被停了完毕.
[UIView animateWithDuration:.25 animations:^{
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
NSLog(@"%@",finished==YES?@"完成":@"未完成");
}];
我们可以看到,如果没有手动停止块动画(快动画自己做完),那么会打印完成
.如果手动停止块动画,会打印未完成
.