CAKeyframeAnimation的简单使用

本文详细介绍了如何使用Core Animation中的CAKeyframeAnimation类来创建自定义动画效果,包括设置动画的关键帧、时间间隔、动画模式等,并通过实例展示了路径动画、抖动动画和边距线宽动画。

  首先CAKeyframeAnimationCABasicAnimation一样是继承自CAPropertyAnimation

 在就是创建一个view来展示这个动画

 UIView *viewAnim = [[UIView alloc]init];

 viewAnim.backgroundColor = [UIColor yellowColor];

 viewAnim.frame = CGRectMake(100, 200, 100, 100);

 _viewAnim=viewAnim;

 [self.view addSubview:viewAnim];

 

 这个方法是调用CAAnimationCAAnimationCAPropertyAnimation的父类

 CAKeyframeAnimation *anim = [CAKeyframeAnimationanimation];

 

 

 CGFloat x=self.viewAnim.center.x;

 CGFloat y=self.viewAnim.center.y;

 CGFloat margin=100;

 NSValue *value1 = [NSValuevalueWithCGPoint:CGPointMake(x,y)];

 NSValue *value2 = [NSValuevalueWithCGPoint:CGPointMake(x,y+margin)];

 NSValue *value3 = [NSValuevalueWithCGPoint:CGPointMake(x+margin,y+margin)];

 NSValue *value4 = [NSValuevalueWithCGPoint:CGPointMake(x+margin,y)];

 NSValue *value5 = [NSValuevalueWithCGPoint:CGPointMake(x,y)];

 

 设置每一帧的动画,每一帧的位置全在这个数组里面

 anim.values = [[NSArray alloc]initWithObjects:value1,value2,value3,value4,value5,nil];

 

 

 

 这个keyTimes是可选的,他的元素必须是NSNumber类型,而且每一个number是必须在0~1之间。

 而且,这个连续的数字必须是递增的,,也就是说,前一个一定要比后一个值要小,或者等于。

 当这个数组的个数大于values的个数时,多出来的个数会被忽略。

 当这个数组的个数小于values的个数时,会有一闪而逝的感觉。

 若这个值是无效的话,也会被忽略

 设置了这个之后,就不要再设置duration这个属性了

 anim.keyTimes = [[NSArray alloc]initWithObjects:@(0),@(0.3),@(0.5),@(0.7),@(1),nil];

 

 discrete;离散的,就是不进行插值计算,所有关键帧直接逐个进行显示

 paced;使得动画均匀进行,而不是按keyTimes设置的或者按关键帧平分时间,此时keyTimes和timingFunctions无效

 cubic; 对关键帧为座标点的关键帧进行圆滑曲线相连后插值计算,

             对于曲线的形状还可以通过tensionValues,continuityValues,biasValues来进行调整自定义,

             这里的数学原理是Kochanek–Bartels spline,这里的主要目的是使得运行的轨迹变得圆滑

 cubicPaced;看这个名字就知道和kCAAnimationCubic有一定联系,其实就是在kCAAnimationCubic的基础上使得动画运行变得均匀,

                    就是系统时间内运动的距离相同,此时keyTimes以及timingFunctions也是无效的.

 linear; calculationMode的默认值,表示当关键帧为座标点的时候,关键帧之间直接直线相连进行插值计算

 当这个属性是paced或者cubicPaced的时候,keyTimestimingFunctions会被忽略

 anim.calculationMode = @"linear";

 

 

 设置动画的方式,这个是位移的方式这个属性是父类CAPropertyAnimation的属性

 anim.keyPath = @"position";

 

 设置时间CAAnimation的协议

 anim.duration = 5;

 

 设置代理可以检测动画的开始和执行.CAAnimation的代理

 不需要在这个类里面遵守协议

 而且你调到这个头文件。你会发现,strong

 anim.delegate = self;

 

 最后在添加动画

 [self.viewAnim.layer addAnimation:anim forKey:@"CAKeyframeAnimation"];

 

 这两个方法是代理方法,动画执行开始和结束的方法

 -(void)animationDidStart:(CAAnimation *)anim{

 

 }

 -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{

 

 }

 以下是自己写的小动画的demo keyPath有很多种,我在基础动画的时候写过一些keyPath,其实就是view的一些属性而已

 有兴趣的可以自己研究研究

 

 path路径的动画

 -(void)animationPath{

 

 CAKeyframeAnimation *anim = [CAKeyframeAnimation animation];

 anim.keyPath = @"position";

 

 

 CGFloat margin = 200;

 CGFloat x = self.viewAnim.frame.origin.x;

 CGFloat y = self.viewAnim.frame.origin.y;

 

 UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(x, y, margin, margin)];

 anim.path = path.CGPath;

 anim.duration = 2;

 [self.viewAnim.layer addAnimation:anim forKey:@"CAKeyframeAnimation"];

 

 

 }

 

 抖动的动画

 -(void)animationShake{

 

 CAKeyframeAnimation *anima = [CAKeyframeAnimation animation];

 anima.keyPath = @"transform.rotation";

 

 NSValue *value1 = @(-M_PI_2/8);

 NSValue *value2 = @(M_PI_2/8);

 NSValue *value3 = @(-M_PI_2/8);

 anima.values = @[value1,value2,value3];

 anima.repeatCount = MAXFLOAT;

 anima.duration = .15;

 [self.viewAnim.layer addAnimation:anima forKey:@"shakeAnimation"];

 

 }

 

 边距线宽的动画 borderWidth

 -(void)animationBorderWidth{

 

 CAKeyframeAnimation *anima = [CAKeyframeAnimation animation];

 anima.keyPath = @"borderWidth";

 

 NSValue *value1 = @(0);

 NSValue *value2 = @(10);

 NSValue *value3 = @(20);

 NSValue *value4 = @(0);

 anima.values = @[value1,value2,value3,value4];

 anima.duration = 1;

 [self.viewAnim.layer addAnimation:anima forKey:@"borderWidthAnimation"];

 

 

 }

 

 其他属性因为平时很少用到,我也没研究,只是看了看。不做讨论了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值