*CAAnimtion是所有动画对象的父类, 负责控制动画的持续时间和速度. 是一个抽象类, 不能直接使用,应该使用其子类.
- 属性说明:
1 duration: 动画持续时间
2 repeatCount: 动画的重复次数
3 repeatDuration: 重复时间
4 removeOnCompletion: Bool值默认为yes, 表示动画执行完毕后就从图层上移除. 图形会恢复到执行之前的状态.( 如果想要保持执行之后的状态, 那就需要设置为NO, 但是, 还需要设置FillModel值为看CAFillModeForward )
5 fillModel: 决定当前对象在非活动的时间段的行为, 比如动画开始之前, 或者动画结束之后(想要fillModel有效, 最好将removeOnCompletion = NO)5.1 kCAFillModeRemove: 默认值也就是说当前动画开始前和动画结束后, 动画对layer都没有影响, 动画结束之后, layer会恢复到之前的状态.
5.2 kCAFillModeForwards: 动画结束后, layer会一直保持, 动画最后状态
5.3 kCAFillModeBackwards: 在动画开始之前, 只需要将动画加入一个layer, layer便立即进入动画的初始状态, 并等待动画开始.
5.4 kCAFillModeBoth: 就是上面两个的合成.(Forwards+Backforwards)
6 beginTime: 可以用来设置动画延迟时间, 若想延迟2s,就设置为CACurrentMediaTime() + 2, CACurrentMediaTime()为图层当前的时间
7 timingFunction: 表示速度控制函数, 控制动画运行的节奏
>>7.1 CAMediaTimingFunctionLinear: 线性匀速, 相对静态的动画
>>7.2 CAMediaTimingFunctionEaseIn: 动画淡入, 加速离开
>>7.3 CAMediaTimingFunctionEaseOut: 动画淡出, 全速进入, 然后减速到达目的地
>>7.4 CAMediaTimingFunctionEaseInOut: 动画淡入淡出
8 keyPath: 通过定制CALayer的一个属性名称为keyPath(NSString类型), 并且对CALayer的这个属性的值进行修改, 达到相应的动画效果, 比如指定:keyPath为@"position", 就相当于修改了CALayer的position的值, 达到平移动画的效果

Animation动画类.png
*动画实现实例:
#import "SecondViewController.h"
@interface SecondViewController ()
//声明属性, 方便查看动画效果
@property (strong, nonatomic) UILabel *label;
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.label = [[UILabel alloc] init];
self.label.bounds = CGRectMake(0, 0, 100, 100);
self.label.layer.anchorPoint = CGPointMake(0, 0);
//self.label.center = self.view.center;
self.label.backgroundColor = [UIColor redColor];
[self.view addSubview:self.label];
self.view.backgroundColor = [UIColor colorWithRed:0.464 green:0.721 blue:1.000 alpha:1.000];
}
# 以下动画效果, 不能同时执行,也就是说不能同时添加到layer层上, 所以在执行的时候, 需要屏蔽掉多余的动画
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
#pragma mark --------- CABasicAnimation -----
#特点: CABasicAnimation只能从 开始值(fromValue)-->结束值(toValue), 也就是说只有一个动画效果
//1. 创建CABasicAnimation动画对象
CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
//2. 动画效果的初始值
basic.fromValue = @1;
//3. 动画效果变换的结束值(绝对值)
basic.toValue = @50;
//4. 执行时间
basic.duration = 10;
//5. 将动画加入一个layer
[self.label.layer addAnimation:basic forKey:@"a"];
#pragma mark --------- CAKeyFrameAnimation -----
#特点: 关键帧动画, 可以利用一个数组, 保存这些数组, 实现多个位置的变换
//1. 创建CAKeyframeAnimation动画对象
CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"position"];
//2. 设置位置(即: 每个关键帧的位置, 动画会根据关键帧进行动画移动)
NSValue *value1 = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
NSValue *value2 = [NSValue valueWithCGPoint:CGPointMake(100, 0)];
NSValue *value3 = [NSValue valueWithCGPoint:CGPointMake(200, 0)];
NSValue *value4 = [NSValue valueWithCGPoint:CGPointMake(200, 100)];
NSValue *value5 = [NSValue valueWithCGPoint:CGPointMake(200, 300)];
//3. 添加到values数组中
//values: NSArray对象, 里面的元素称为:keyFrame(关键帧), 动画对象会在指定的时间里, 依次显示values数组中的每一个关键帧
keyFrame.values =@[value1, value2, value3, value4, value5];
//4. 设置动画持续时间
keyFrame.duration = 10;
//可以设置每一帧的时间, 每一帧的时间为比例的累加计算,取值范围: 0~1.0. 如果没有指定具体某一帧的时间, 那么时间是平均的
//keyFrame.keyTimes = @[@(0.1),@(0.1),@(0.1)];
//5. 将动画添加到layer层
[self.label.layer addAnimation:keyFrame forKey:@"A"];
#pragma mark --------- CAAnimationGroup -----
#特点: 用来管理多组动画, 而不仅仅是单纯的帧效果
# 默认情况下, 一组动画对象是同时运动的, 也可以通过设置动画的beginTime属性来更改动画的开始时间
//1. 创建对象
CAAnimationGroup *group = [CAAnimationGroup animation];
//2. 用来保存一组动画对象的NSArray
group.animations = @[basic, keyFrame];
//3. 设置动画持续时间
group.duration = 10;
//4. 添加到layer层上
[self.label.layer addAnimation:group forKey:@"B"];
#pragma mark --------- CASpringAnimation -----
//1. 创建对象
CASpringAnimation *spring = [CASpringAnimation animationWithKeyPath:@"position.x"];
//2. 设置动画效果的初始值(动画速度)
spring.fromValue = @50;
//3. 设置动画效果的结束值
spring.toValue = @200;
//4. 阻尼系数
spring.damping = 0.5;
//5. 刚度系数(劲度系数, 弹性系数. 系数越大产生的形变力就越大)
spring.stiffness = 10;
//6. 质量(影响图层运动时的弹簧惯性, 质量系数越大: 弹簧拉伸的幅度越大(动画幅度,波动变大))
spring.mass = 1;
//7. 初始速率(动画效果的初始速度). 初始速率为正数时: 速度方向与运动方向一致, 否则相反.
spring.initialVelocity = 1;
//8. 设置持续时间: settlingDuration: 结算时间(估算),返回弹簧动画从开始到动画结束, 所需时间(根据各个参数进行估算)
spring.duration = spring.settlingDuration;
//9. 添加到layer层上
[self.label.layer addAnimation:spring forKey:@"spring"];
}
@end```