-(void)creatKeyAnimation{
//初始化演员
CALayer *rectLayer = [[CALayer alloc] init];
rectLayer.frame = CGRectMake(15, 200, 30, 30);
rectLayer.cornerRadius = 15;
rectLayer.backgroundColor = [UIColor blackColor].CGColor;
[self.view.layer addSublayer:rectLayer];
//剧本
CAKeyframeAnimation *rectRunAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
//values属性指明整个动画过程中的关键帧点,需要注意的是,起点必须作为values的第一个值。
rectRunAnimation.values = @[
[NSValue valueWithCGPoint:rectLayer.frame.origin],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width - 15, rectLayer.frame.origin.y)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width - 15, rectLayer.frame.origin.y + 100)],
[NSValue valueWithCGPoint:CGPointMake(15, rectLayer.frame.origin.y + 100)],
[NSValue valueWithCGPoint:rectLayer.frame.origin]
];
//谁知每个关键帧的时长,如果没有显示的设置,则默认每个帧的时间 = 总duration / (values.count - 1); 这个不是每段动画的执行时间 而是 总的执行时间 慢慢增加的 第一段时间为 0.6 第二段为 0.1 第三段为0.1 第四段为 0.2 首尾必须分别是 0 和 1
rectRunAnimation.keyTimes = @[
[NSNumber numberWithFloat:0.0],
[NSNumber numberWithFloat:0.6],
[NSNumber numberWithFloat:0.7],
[NSNumber numberWithFloat:0.8],
[NSNumber numberWithFloat:1.0]
];
rectRunAnimation.timingFunctions = @[
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear],
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear],
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear],
[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear],
];
//动画次数 无限
rectRunAnimation.repeatCount = MAXFLOAT;
//动画回放
rectRunAnimation.autoreverses = NO;
//该属性决定了物体在每个子路径下是跳着走还是匀速走,跟timeFunctions属性有点类似 kCAAnimationDiscrete//离散,无中间过程,但keyTimes设置的时间依旧生效,物体跳跃地出现在各个关键帧上
rectRunAnimation.calculationMode = kCAAnimationLinear;
rectRunAnimation.duration = 4;
[rectLayer addAnimation:rectRunAnimation forKey:nil];
}
/*
(1)path属性
作用与values属性一样,同样是用于指定整个动画所经过的路径的。需要注意的是,values与path是互斥的,当values与path同时指定时,path会覆盖values,即values属性将被忽略。例如上述例子等价于代码中values方式的path设置方式为:
1 CGMutablePathRef path = CGPathCreateMutable();
2 CGPathMoveToPoint(path, NULL, rectLayer.position.x - 15, rectLayer.position.y - 15);
3 CGPathAddLineToPoint(path, NULL, 320 - 15, rectLayer.frame.origin.y);
4 CGPathAddLineToPoint(path, NULL, 320 - 15, rectLayer.frame.origin.y + 100);
5 CGPathAddLineToPoint(path, NULL, 15, rectLayer.frame.origin.y + 100);
6 CGPathAddLineToPoint(path, NULL, 15, rectLayer.frame.origin.y);
7 rectRunAnimation.path = path;
8 CGPathRelease(path);
(2)timeFunctions属性
用过UIKit层动画的同学应该对这个属性不陌生,这个属性用以指定时间函数,类似于运动的加速度,有以下几种类型。上例子的AB段就是用了淡入淡出效果。记住,这是一个数组,你有几个子路径就应该传入几个元素
1 kCAMediaTimingFunctionLinear//线性
2 kCAMediaTimingFunctionEaseIn//淡入
3 kCAMediaTimingFunctionEaseOut//淡出
4 kCAMediaTimingFunctionEaseInEaseOut//淡入淡出
5 kCAMediaTimingFunctionDefault//默认
此外,动画的暂停与开始可以通过下面的方式做到:
-(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;
}
*/