概念篇:
. CoreAnimation翻译过来就是核心动画,听起来很高大上,其实它就是一组API而已,一组很强大的动画处理API,它会让你的应用使用很少的代码构建出很绚丽的效果。
.Core Animation的动画执行都是在后台(子线程),不会阻塞到主线程的
.Core Animation是直接作用在CaLayer上的,并不是UIView上
使用步骤:
1.首先把QuaratzCore.framework添加进来并 应用头文件<QuartzCore/QuartzCore.h>
2.初始化一个CAAnimation 对象,并设置属性(其实我们一般使用CAAnimation的子类)后面会说为什么,从属性中可以确定我们的动画是怎样的
3.这是最很重要的一步,上面说过CoreAnimation是作用在CALayer上的,调用CALayer的addAnimation:forKey:方法把动画添加到CALyaer上这样就能执行动画了
4.移除动画,调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画
CAAnimation继承关系
经常用CoreAnimarion的朋友应该知道我们平时基本不会直接使用CAAnimation初始化一个动画对象,一般情况下我们都是用其子类,下面我们看看他的继承结构
* CAAnimation是所有动画类的父类,但是它不能直接使用,应该使用它的子类
* 常见属性有:
1>duration:动画的持续时间
2>repeatCount:动画的重复次数,loadingAnimation.repeatCount = LONG_MAX(基本可以代表无限循环了)
3>timingFunction:控制动画运行的节奏
timingFunction可选的值有:
kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉
kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开
kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地
kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。
4>delegate:动画代理
动画开始的时候调用
- (void)animationDidStart:(CAAnimation *)anim;
动画停止的时候调用
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
下面介绍几个我们常用的动画类
CABasicAnimation:基本动画类,继承CAPropertyAnimation属性动画
来一波代码感受一下
CABasicAnimation *loadingAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; //核心部分了,定义某个属性
loadingAnimation.duration = 0.8; //动画持续时间
loadingAnimation.repeatCount = LONG_MAX; //重复次数
loadingAnimation.fromValue = @(0); //开始值
loadingAnimation.toValue = @(2*M_PI); //结束值
动画过程说明:
随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值从fromValue渐渐地变为toValue
keyPath内容是CALayer的可动画Animatable属性
如果fillMode=kCAFillModeForwards同时removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。可以通过打印看看其位置信息
CAKeyframeAnimation 关键帧动画,继承CAPropertyAnimation属性动画
属性说明:
values:上述的NSArray对象。里面的元素称为“关键帧”(keyframe)。动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧
path:可以设置一个CGPathRef、CGMutablePathRef,让图层按照路径轨迹移动。path只对CALayer的anchorPoint和position起作用。如果设置了path,那么values将被忽略
keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧。如果没有设置keyTimes,各个关键帧的时间是平分的
CABasicAnimation可看做是只有2个关键帧的CAKeyframeAnimation
下一篇将会记录“贝塞尔曲线与CAShapeLayer”的神奇功效