首先CAKeyframeAnimation和CABasicAnimation一样是继承自CAPropertyAnimation
在就是创建一个view来展示这个动画
UIView *viewAnim = [[UIView alloc]init];
viewAnim.backgroundColor = [UIColor yellowColor];
viewAnim.frame = CGRectMake(100, 200, 100, 100);
_viewAnim=viewAnim;
[self.view addSubview:viewAnim];
这个方法是调用CAAnimation,CAAnimation是CAPropertyAnimation的父类
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的时候,keyTimes和timingFunctions会被忽略
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"];
}
其他属性因为平时很少用到,我也没研究,只是看了看。不做讨论了
本文详细介绍了如何使用Core Animation中的CAKeyframeAnimation类来创建自定义动画效果,包括设置动画的关键帧、时间间隔、动画模式等,并通过实例展示了路径动画、抖动动画和边距线宽动画。
563

被折叠的 条评论
为什么被折叠?



