美文网首页
iOS- CoreAnimation动画

iOS- CoreAnimation动画

作者: 流云_henry | 来源:发表于2020-07-10 15:13 被阅读0次

我们知道,Layer层中可以设置许多与控件UI相关的属性,并且对于iOS开发,UIView层的属性是会映射到CALayer的,因此可以通过UIKit和CoreAnimation两个框架来设置控件的UI相关属性,当属性发生变化时,我们可以使其展示一个动画效果。
CAAnimation是CoreAnimation框架中执行动画对象的基类。如下图就描述了CoreAnimation框架中的一些类的关系。


image.png

从上图中我们可以看到,从CAAnimation中继承出了三个子类,分包是用于创建属性动画的CAPropertyAnimation,创建转场动画的CATransition和创建组合动画的CAAnimationGroup。

1、CAAnimation

作为动画对象的基类,CAAnimation中封装了动画的基础属性,如下:


/* 通过类方法创建一个CAAnimation对象 */
+ (instancetype)animation;

/* 动画执行的时序模式 
kCAMediaTimingFunctionLinear//线性执行
kCAMediaTimingFunctionEaseIn//淡入,在动画开始时的淡入效果
kCAMediaTimingFunctionEaseOut//淡出,在动画结束时的淡出效果
kCAMediaTimingFunctionEaseInEaseOut//淡入、淡出
kCAMediaTimingFunctionDefault//默认效果
*/
@property(nullable, strong) CAMediaTimingFunction *timingFunction;

/* 是否在动画完成时将动画对象移除,默认是YES */

@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion;

/* 代理*/
@property(nullable, strong) id <CAAnimationDelegate> delegate;
//代理方法如下:
/*在动画开始时执行的回调*/
- (void)animationDidStart:(CAAnimation *)anim;
/*在动画结束后执行的回调*/
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

2、CAPropertyAnimation

CAPropertyAnimation是继承于CAAnimation,专门用来创建与属性相关的动画类。

/*创建对象,参数中的path就是我们要传入的动画属性
例如如果传入@“backgroundColor”,则当Layer的背景颜色改变时,就会执行我们设置的动画
*/
+ (instancetype)animationWithKeyPath:(nullable NSString *)path;
@property(nullable, copy) NSString *keyPath;

/*这个属性确定动画执行的状态是否叠加在控件的原状态上
默认为NO,如果我们执行两次位置移动的动画,则会从同一位置执行两次
如果设置为YES,则会在第一次执行的基础上执行第二次动画
*/
@property(getter=isAdditive) BOOL additive;

/*这个属性对重复执行的动画有效果
  默认NO,重复执行的动画每次都是从起始状态开始的
如果设置为YES,则每次执行都会在上一次执行的基础上执行
*/
@property(getter=isCumulative) BOOL cumulative;
/*这个属性和transform属性的动画执行相关*/
@property(nullable, strong) CAValueFunction *valueFunction;

在上面的属性中,我们需要注意,valueFunction是专门为了transform动画而设置的,因为我们没有办法直接改变tran3D中的属性,通过这个参数,我们可以直接操作tran3D属性变化产生动画效果。下面就是一个围绕z轴旋转的动画:

- (void)addAnimalForZTransform {
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
    //设置Z轴旋转
    animation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionTranslateZ];
    //我们也可以直接设置
//    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    
    //从0度开始
    animation.fromValue = @0;
    //选择到180度
    animation.toValue = [NSNumber numberWithFloat:M_PI];
    //时长
    animation.duration = 2;
    //执行动画
    [self.view.layer addAnimation:animation forKey:@""];
}

3、CAKeyframeAnimation

CABasicAnimation是CAPropertyAnimation分出来的一个子类,只能设置初始和结束状态,之间的变化我们没法控制,而CAKeyframeAnimation可以让我们在整个动画的过程中设置一些关键帧。

- (void)addAnimationForKeyFrame {
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    //关键帧的值数组,例如我们想让控件沿着某个路径移动,这里面存放每个移动点
    animation.values = @[[NSValue valueWithCGPoint:CGPointMake(100, 100)],[NSValue valueWithCGPoint:CGPointMake(120, 100)],[NSValue valueWithCGPoint:CGPointMake(120, 200)],[NSValue valueWithCGPoint:CGPointMake(200, 200)]];
    //设置每一帧执行的时间长短,取值0~1,代表占用时间的比例
    animation.keyTimes = @[@0.1,@0.3,@0.5,@0.1];
    //每一帧执行过程中的时序效果
    animation.timingFunctions = @[kCAMediaTimingFunctionEaseIn,kCAMediaTimingFunctionEaseInEaseOut,kCAMediaTimingFunctionEaseInEaseOut,kCAMediaTimingFunctionEaseOut];
    animation.duration = 3;
    [self.view.layer addAnimation:animation forKey:@""];
}

4、CASpringAnimation

通过CASpringAnimation,我们可以很轻松的创建出有弹簧效果的动画,其主要属性如下:

/* 设置弹簧重物的质量,会影响惯性,必须大于0,默认为1*/
@property CGFloat mass;

/* 设置弹簧的刚度系数,必须大于0,默认为100,这个值越大,则回弹越快 */
@property CGFloat stiffness;

/* 阻尼系数,默认为10,必须大于0,这个值越大,则回弹的幅度越小 */
@property CGFloat damping;

/* 初始速度 */
@property CGFloat initialVelocity;

/* 获取动画停下来需要的时间*/
@property(readonly) CFTimeInterval settlingDuration;

5、CATransition

CATransition常被称为转场动画,和CAPropertyAnimation的不同之处在于当Layer层出现时,而并不是属性改变时,其会产生动画效果。

6、CAAnimationGroup

CAAnimationGroup本身并没有定义动画,他可以将我们上面提到的相关动画进行组合。

相关文章

网友评论

      本文标题:iOS- CoreAnimation动画

      本文链接:https://www.haomeiwen.com/subject/gbwpcktx.html