Copyright © 2017年ZaneWangWang. All rights reserved.
CAAnimation动画体系的介绍
如果你看到的不是原文请看原文CoreAnimation开发框架中Layer层动画,想看应用实例请看我的另一篇文章iOS中Layer层CABasicAnimation和CAAnimationGroup应用。
CAAnimation是CoreAnimation框架中执行动画对象的基类,从CAAnimation中集成出三个子类分别是用于创建属性动画的CAPropertyAnimation,创建转场动画的CATransition和创建组合动画的CAAnimationGroup。
1.CAAnimation属性和方法
a.CAAnimation作为动画对象的基类,其中封装了动画的基础属性,如下:
+ (instancetype)animation;//通过类方法创建一个CAAnimation对象
@property(nullable, strong) CAMediaTimingFunction *timingFunction;//动画执行的时序模式
@property(nullable, strong) id delegate;//代理
@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion;//是否动画完成时将动画对象移除掉
b.timingFunction定义了动画执行的时序效果,CAMediaTimingFunction的创建方式如下:
+ (instancetype)functionWithName:(NSString *)name;
name参数决定的执行的效果,可选参数如下
NSString * const kCAMediaTimingFunctionLinear;//线性执行
NSString * const kCAMediaTimingFunctionEaseIn;//淡入 在动画开始时 淡入效果
NSString * const kCAMediaTimingFunctionEaseOut;//淡出 在动画结束时 淡出效果
NSString * const kCAMediaTimingFunctionEaseInEaseOut;//淡入淡出
NSString * const kCAMediaTimingFunctionDefault;//默认效果
c.CAAnimation的代理方法入如下几个:
- (void)animationDidStart:(CAAnimation *)anim;//动画开始时执行的回调
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;//动画结束后执行的回调
2.CAPropertyAnimation属性与方法
a.CAPropertyAnimation是继承于CAAnimation专门用来创建与属性相关的动画的类:
+ (instancetype)animationWithKeyPath:(nullable NSString *)path;//创建对象 参数path就是执行动画的属性的字符串
例如:要修改透明度path就传@"alpha";
@property(getter=isAdditive) BOOL additive;//动画执行状态是否叠加在控件原状态上,默认为NO
@property(getter=isCumulative) BOOL cumulative;//对于重复动画来说,默认为NO从起始状态开始,YES表示在上一次执行基础之上执行
@property(nullable, strong) CAValueFunction *valueFunction;//和transfron属性的动画执行相关,通过这个参数,可以帮助我们直接操作transfrom3D属性变化产生动画效果
例如:做一个z轴的旋转动画
CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform"];
animation.fromValue = @0;//从0度开始
animation.toValue = [NSNumber numberWithFloat:M_PI];//旋转到180度
animation.duration = 2;//时间2S
animation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ];//设置为z轴旋转,实际上我们也可以不设置这个属性,只需要在创建动画对象的时候的path变为@"transform.rotation.z"也可以访问到这个属性
[layer addAnimation:animation forKey:@""];//执行动画
3.CABasicAnimation属性
CABasicAnimaton是CAPropertyAnimation分出来的一个子类,创建基础的属性变化动画,例如我们上面的示例代码,其中属性如下:
@property(nullable, strong) id fromValue;//对应属性动画开始值
@property(nullable, strong) id toValue;//对应属性动画结束值
@property(nullable, strong) id byValue;///和fromeValue配合对应属性动画开始值到fromValue+byValue,和toValue配合从toValue-byValue到toValue
具体确定动画方案如下:
(1)fromValue和toValue不为空:动画的值由fromValue变化到toValue
(2)fromValue和byValue不为空:动画的值由fromValue变化到fromValue+byValue
(3)byValue和toValue不为空:动画的值由toValue-byValue变化到toValue
(4)只有fromValue不为空:动画的值由fromValue变化到layer的当前状态值
(5)只有toValue不为空:动画的值由layer当前的值变化到toValue
(6)只有byValue不为空:动画的值由layer当前的值变化到layer当前的值+byValue
4.CAKeyframeAnimation关键帧动画
CAKeyframeAnimation也是继承与CAPropertyAnimation的一个子类,其与CABasicAnimation的不同之处在于虽然其都是改变layer层属性的动画,但是CABasicAnimation只能设置初始与结束状态,这之间我们没办法控制,而CAKeyframeAnimation可以让我们设置一些关键帧再整个动画的过程中。属性方法如下:
@property(nullable, copy) NSArray *values;//关键帧的值数组 例如我们想让控件沿某个路径移动,这里面存放每个移动的点
例如:
CAKeyframeAnimation * ani = [CAKeyframeAnimation animationWithKeyPath:@"position"];
ani.values = @[[NSValue valueWithCGPoint:CGPointMake(100, 100)],[NSValue valueWithCGPoint:CGPointMake(120, 100)],[NSValue valueWithCGPoint:CGPointMake(120, 200)],[NSValue valueWithCGPoint:CGPointMake(200, 200)]];
ani.duration = 3;
[layer addAnimation:ani forKey:@""];
@property(nullable) CGPathRef path;//直接设置路径,作用域values类似
@property(nullable, copy) NSArray *keyTimes;//设置每一帧执行的时间长短 这个的取值为0-1,代表占用时间的比例
@property(nullable, copy) NSArray *timingFunctions;//每一帧的时序效果,详见CAAnimation介绍b条
@property(copy) NSString *calculationMode;//设置帧的中间值如何计算
有以下几种:
NSString * const kCAAnimationLinear;
NSString * const kCAAnimationDiscrete;
NSString * const kCAAnimationPaced;
NSString * const kCAAnimationCubic;
NSString * const kCAAnimationCubicPaced;
5.CATransition转场动画
CATransition和CAPropertyAnimation的不同之处在于当layer层出现时,会产生动画效果,而并不是属性改变时,属性如下:
@property(copy) NSString *type;//设置动画类型
动画类型有:
NSString * const kCATransitionFade;//淡入
NSString * const kCATransitionMoveIn;//移入
NSString * const kCATransitionPush;//压入
NSString * const kCATransitionReveal;//溶解
@property(nullable, copy) NSString *subtype;//设置动画的方向
动画方向有:
NSString * const kCATransitionFromRight;//从右侧进
NSString * const kCATransitionFromLeft;//从左侧进
NSString * const kCATransitionFromTop;//从上侧进
NSString * const kCATransitionFromBottom;//从下侧进
其实,关于type定义的动画效果,出来官方定义的,我们还可以使用一些私有的参数,如下:
(1)pageCurl 翻页
(2)rippleEffect 滴水效果
(3)suckEffect 收缩效果,如一块布被抽走
(4)cube 立方体效果
(5)oglFlip 上下翻转效果
例如:
CATransition * ani = [CATransition animation];
ani.type = @"pageCurl";
ani.subtype = kCATransitionFromRight;
[layer addAnimation:ani forKey:@""];
6.CAAnimationGroup动画组
CAAnimationGroup本身并没有定义动画,他可以将我们上面提到的相关动画进行组合:
@property(nullable, copy) NSArray *animations;//动画组
高级动画技巧
1.事务类
CoreAnimation中还有一个非常重要的类:CATransaction事物类,这个可以同时设置多个layer层的动画效果。可以通过隐式和显式两种方式来进行动画操作。
2.CATransaction属性
对layer层的属性操作,都会形成隐式动画,要使用隐式动画,需要关闭layer层的animation动画属性,使用下面的方法:
+ (BOOL)disableActions;//关闭animation动画效果,开启隐式动画
+ (void)setDisableActions:(BOOL)flag;
CATransaction用类方式通过设置key-value来进行动画的属性设置:
+ (nullable id)valueForKey:(NSString *)key;
+ (void)setValue:(nullable id)anObject forKey:(NSString *)key;
支持的key值如下:
NSString * const kCATransactionAnimationDuration;//设置动画持续时间
NSString * const kCATransactionDisableActions;//设置停用animation类动画
NSString * const kCATransactionAnimationTimingFunction;//设置动画时序效果
NSString * const kCATransactionCompletionBlock;//设置动画完成后的回调
除了隐式的展示动画外,也可以显式的通过调用CATransaction的相关方法进行显示的提交动画:
+ (void)begin;//动画开始
+ (void)commit;//提交动画
+ (void)flush;//立即进行动画渲染 一般不需调用
下面这两个方法用于动画事物的加锁与解锁 在多线程动画中,保证修改属性的安全
+ (void)lock;
+ (void)unlock;
本文借鉴脚本之家大神博文