三、关键帧动画:CAKeyframeAnimation
(1)values属性
values属性指明整个动画过程中的关键帧点。
(2)path属性
这是一个 CGPathRef 对象,默认是空的,当我们创建好CAKeyframeAnimation的实例的时候,可以通过制定一个自己定义的path来让某一个物体按照这个路径进行动画。这个值默认是nil,当其被设定的时候,values这个属性就被覆盖 。
CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToPoint(path, NULL, rectLayer.position.x - 15, rectLayer.position.y - 15); CGPathAddLineToPoint(path, NULL, 320 - 15, rectLayer.frame.origin.y); CGPathAddLineToPoint(path, NULL, 320 - 15, rectLayer.frame.origin.y + 100); CGPathAddLineToPoint(path, NULL, 15, rectLayer.frame.origin.y + 100); CGPathAddLineToPoint(path, NULL, 15, rectLayer.frame.origin.y); rectRunAnimation.path = path; CGPathRelease(path);
(3)keyTimes属性
该属性是一个数组,用以指定每个子路径(AB,BC,CD)的时间。如果你没有显式地对keyTimes进行设置,则系统会默认每条子路径的时间为:ti=duration/(5-1),即每条子路径的duration相等,都为duration的1\4。当然,我们也可以传个数组让物体快慢结合。例如,你可以传入{0.0, 0.1,0.6,0.7,1.0},其中首尾必须分别是0和1,因此tAB=0.1-0, tCB=0.6-0.1, tDC=0.7-0.6, tED=1-0.7.....
(4)timeFunctions属性
用过UIKit层动画的同学应该对这个属性不陌生,这个属性用以指定时间函数,类似于运动的加速度,有以下几种类型。上例子的AB段就是用了淡入淡出效果。记住,这是一个数组,你有几个子路径就应该传入几个元素
kCAMediaTimingFunctionLinear//线性 kCAMediaTimingFunctionEaseIn//淡入 kCAMediaTimingFunctionEaseOut//淡出 kCAMediaTimingFunctionEaseInEaseOut//淡入淡出 kCAMediaTimingFunctionDefault//默认
(5)calculationMode属性
该属性决定了物体在每个子路径下是跳着走还是匀速走,跟timeFunctions属性有点类似
const kCAAnimationLinear//线性,默认
const kCAAnimationDiscrete//离散无中间过程 keyTimes设置的时间仍生效 跳跃地出现在各个关键帧上
const kCAAnimationPaced//平均,keyTimes跟timeFunctions失效
const kCAAnimationCubic//平均,同上
const kCAAnimationCubicPaced//平均,同上
此外,动画的暂停与开始可以通过下面的方式做到:
-(void)pauseLayer:(CALayer*)layer { CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; layer.speed = 0.0; layer.timeOffset = pausedTime; } -(void)resumeLayer:(CALayer*)layer { CFTimeInterval pausedTime = [layer timeOffset]; layer.speed = 1.0; layer.timeOffset = 0.0; layer.beginTime = 0.0; CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; layer.beginTime = timeSincePause; }