iOS动画分为显性动画和隐性动画两种。
显示动画动画分为几类:基础动画、关键帧动画、动画组、转场动画。各个类的关系大致如下:
CAAnimation:核心动画的基础类,不能直接使用,负责动画运行时间、速度的控制,本身实现了CAMediaTiming协议。
CAPropertyAnimation:属性动画的基类(通过属性进行动画设置,注意是可动画属性),不能直接使用。
CAAnimationGroup:动画组,动画组是一种组合模式设计,可以通过动画组来进行所有动画行为的统一控制,组中所有动画效果可以并发执行。
CATransition:转场动画,主要通过滤镜进行动画效果设置。
CABasicAnimation:基础动画,通过属性修改进行动画参数控制,只有初始状态和结束状态。
CAKeyframeAnimation:关键帧动画,同样是通过属性进行动画参数控制,但是同基础动画不同的是它可以有多个状态控制。
基础动画、关键帧动画都属于属性动画,就是通过修改属性值产生动画效果,开发人员只需要设置初始值和结束值,中间的过程动画(又叫“补间动画”)由系统自动计算产生。和基础动画不同的是关键帧动画可以设置多个属性值,每两个属性中间的补间动画由系统自动完成,因此从这个角度而言基础动画又可以看成是有两个关键帧的关键帧动画。
关键帧动画开发分为两种形式:一种是通过设置不同的属性值进行关键帧控制,另一种是通过绘制路径进行关键帧控制。后者优先级高于前者,如果设置了路径则属性值就不再起作用。
前面说过图层动画的本质就是将图层内部的内容转化为位图经硬件操作形成一种动画效果,其实图层本身并没有任何的变化。上面的动画中图层并没有因为动画效果而改变它的位置(对于缩放动画其大小也是不会改变的),所以动画完成之后图层还是在原来的显示位置没有任何变化,如果这个图层在一个UIView中你会发现在UIView移动过程中你要触发UIView的点击事件也只能点击原来的位置(即使它已经运动到了别的位置),因为它的位置从来没有变过。
解决此点击问题可以在动画view中重写如下方法:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event {
CGRect presentingRect =self.frame;
//如果不在动画中则presentationLayer为空,在动画中就需要实时的判断点击是否点中动画中的动画
if (self.layer.presentationLayer) {
presentingRect =self.layer.presentationLayer.frame;
}
CGPoint superPoint = [self convertPoint:point toView:self.superview];
BOOLisInside =CGRectContainsPoint(presentingRect, superPoint);
returnisInside;
}
UIView动画称为隐式动画,此动画和显示动画不同的是在动画过程中改变的就是uiview各个属性的值,所以点击会生效。
但是这里需要注意的是隐式动画默认是不接收点击事件的,需要我们手动打开UIViewAnimationOptionAllowUserInteraction。
[UIView animateWithDuration:0.8
delay:0.0
options:UIViewAnimationOptionCurveEaseIn|UIViewAnimationOptionAllowUserInteraction
animations:^{
self.indicatorLabel.transform=CGAffineTransformIdentity;
[self.indicatorLabellayoutIfNeeded];
}
completion:^(BOOLfinished) {
}];
参考:
https://www.jianshu.com/p/4c7c7701ef01?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation