CAAnimtion子类动画

*CAAnimtion是所有动画对象的父类, 负责控制动画的持续时间和速度. 是一个抽象类, 不能直接使用,应该使用其子类.
  1. 属性说明:
    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```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 10,533评论 5 13
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 12,720评论 6 30
  • 在iOS实际开发中常用的动画无非是以下四种:UIView动画,核心动画,帧动画,自定义转场动画。 1.UIView...
    请叫我周小帅阅读 8,381评论 1 23
  • Core Animation Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,...
    45b645c5912e阅读 8,179评论 0 21
  • 核心动画(Core Animation)一、Core animation简单介绍 1.Core Animatio...
    北辰青阅读 4,788评论 0 1