【iOS】CoreAnimation

类继承结构

【iOS】CoreAnimation_第1张图片

CAAnimation

CAAnimation是一个抽象动画类,是所有动画类的父类,不能直接使用,应该使用它具体的子类。

CAMediaTiming

CAPropertyAnimation

CABasicAnimation 基础动画

随着动画的执行,在duration的持续时间内,keyPath相应的属性值从fromValue逐渐变为toValue

  • keyPath内容是CALayer的可动画Animation属性

属性:

  • fromValue:keyPath相应属性值的初始值

  • toValue:keyPath相应属性的结束值

  • byValue:keyPath相应属性值的修改值

用法:

CABasicAnimation *animation = [CABasicAnimation animation];
animation.keyPath = @"position"; // 动画类型
animation.duration = 5; // 动画完成时间
animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)]; // 动画初始值
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 300)]; // 动画完成后值
animation.removedOnCompletion = NO; // 动画完成后不删除
animation.fillMode = kCAFillModeForwards; // 保持动画最后状态
[view.layer addAnimation:animation forKey:nil];     

CAKeyframeAnimation 关键帧动画

CApropertyAnimation的子类,跟CABasicAnimation的区别是:CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会用一个NSArray保存多个这样数值

属性:

  • values:就是上述的NSArray对象。里面的元素称为”关键帧”(keyframe)。动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧

  • path:可以设置一个CGPathRef\CGMutablePathRef,让层跟着路径移动。path只对CALayer的anchorPoint和position起作用。如果你设置了path,那么values将被忽略

  • keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧.当keyTimes没有设置的时候,各个关键帧的时间是平分的

说明:CABasicAnimation可看做是最多只有2个关键帧的CAKeyframeAnimation

用法:

CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
animation.keyPath = @"position";
animation.duration = 5;
NSValue *value1 = [NSValue valueWithCGPoint:CGPointMake(0, 100)];
NSValue *value2 = [NSValue valueWithCGPoint:CGPointMake(200, 100)];
NSValue *value3 = [NSValue valueWithCGPoint:CGPointMake(200, 200)];
NSValue *value4 = [NSValue valueWithCGPoint:CGPointMake(300, 200)];
NSValue *value5 = [NSValue valueWithCGPoint:CGPointMake(300, 300)];
NSValue *value6 = [NSValue valueWithCGPoint:CGPointMake(100, 300)];
animation.values = @[value1, value2, value3, value4, value5, value6];
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.repeatCount = 3;
animation.delegate = self;
[_v.layer addAnimation:animation forKey:nil];

CATransition 转场动画

CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果

属性:

  • type:转场动画类型

  • subtype:转场动画方向

  • startProgress:动画起点(在整体动画的百分比)

  • endProgress:动画终点(在整体动画的百分比)

用法:

CATransition *transition = [CATransition animation];
transition.type = @"push"; // 转场效果
transition.subtype = kCATransitionFromLeft; // 转场方向
transition.duration = 2.0;
[_v.layer addAnimation:transition forKey:nil];

CAAnimationGroup 动画组

CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行

属性:

  • animations:用来保存一组动画对象的NSArray

默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间

用法:

// 平移动画
CABasicAnimation *a1 = [CABasicAnimation animation];
a1.keyPath = @"transform.translation.y";
a1.toValue = @(100);

// 缩放动画
CABasicAnimation *a2 = [CABasicAnimation animation];
a2.keyPath = @"transform.scale";
a2.toValue = @(0.0);

// 旋转动画
CABasicAnimation *a3 = [CABasicAnimation animation];
a3.keyPath = @"transform.rotation";
a3.toValue = @(M_PI_2);

// 组动画
CAAnimationGroup *groupAnima = [CAAnimationGroup animation];
groupAnima.animations = @[a1, a2, a3];
groupAnima.duration = 2;
groupAnima.repeatCount = 2;
groupAnima.fillMode = kCAFillModeForwards;
groupAnima.removedOnCompletion = NO;

[view.layer addAnimation:groupAnima forKey:nil];

你可能感兴趣的:(【iOS】CoreAnimation)