[关闭]
@kingw 2016-04-18T00:48:38.000000Z 字数 4614 阅读 1813

CAAnimation

CoreAnimation ios: ios


1.CAAnimation属性和方法

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

  1. //通过类方法创建一个CAAnimation对象
  2. + (instancetype)animation;
  3. //动画执行的时序模式
  4. @property(nullable, strong) CAMediaTimingFunction *timingFunction;
  5. //代理
  6. @property(nullable, strong) id delegate;
  7. //是否动画完成时将动画对象移除掉
  8. @property(getter=isRemovedOnCompletion) BOOL removedOnCompletion;

timingFunction定义了动画执行的时序效果,CAMediaTimingFunction的创建方式如下:

  1. /*
  2. name参数决定的执行的效果,可选参数如下
  3. //线性执行
  4. NSString * const kCAMediaTimingFunctionLinear;
  5. //淡入 在动画开始时 淡入效果
  6. NSString * const kCAMediaTimingFunctionEaseIn;
  7. //淡出 在动画结束时 淡出效果
  8. NSString * const kCAMediaTimingFunctionEaseOut;
  9. //淡入淡出
  10. NSString * const kCAMediaTimingFunctionEaseInEaseOut;
  11. //默认效果
  12. NSString * const kCAMediaTimingFunctionDefault;
  13. */
  14. + (instancetype)functionWithName:(NSString *)name;

CAAnimation的代理方法入如下几个:

  1. //动画开始时执行的回调
  2. - (void)animationDidStart:(CAAnimation *)anim;
  3. //动画结束后执行的回调
  4. - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

2.CAPropertyAnimation属性与方法

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

  1. //创建对象 参数中的path就是我们要执行动画的属性
  2. //例如,如果传入@"backgroundColor" 当layer的背景颜色改变时,就会执行我们设置的动画
  3. + (instancetype)animationWithKeyPath:(nullable NSString *)path;
  4. //这个属性确定动画执行的状态是否叠加在控件的原状态上
  5. //默认设置为NO,如果我们执行两次位置移动的动画,会从同一位置执行两次
  6. //如果设置为YES,则会在第一次执行的基础上执行第二次动画
  7. @property(getter=isAdditive) BOOL additive;
  8. //这个属性对重复执行的动画有效果
  9. //默认为NO,重复执行的动画每次都是从起始状态开始
  10. //如果设置为yes,则为此执行都会在上一次执行的基础上执行
  11. @property(getter=isCumulative) BOOL cumulative;
  12. //这个属性和transfron属性的动画执行相关
  13. @property(nullable, strong) CAValueFunction *valueFunction;

上面这些属性中,只有一个需要我们注意,valueFunction是专门为了transform动画而设置的,因为我们没有办法直接改变transform3D中的属性,通过这个参数,可以帮助我们直接操作transfrom3D属性变化产生动画效果,举例如下,一个绕Z轴旋转的动画:

  1. //绕z轴旋转的动画
  2. CABasicAnimation * ani = [CABasicAnimation animationWithKeyPath:@"transform"];
  3. //从0度开始
  4. ani.fromValue = @0;
  5. //旋转到180度
  6. ani.toValue = [NSNumber numberWithFloat:M_PI];
  7. //时间2S
  8. ani.duration = 2;
  9. //设置为z轴旋转
  10. ani.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ];
  11. //执行动画
  12. [layer addAnimation:ani forKey:@""];

实际上,使用点的方式也是可以访问到相应属性的,如果不设置valueFunction,使用如下方法也是可以进行绕Z轴旋转的:

  1. //绕z轴旋转的动画
  2. CABasicAnimation * ani = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
  3. //从0度开始
  4. ani.fromValue = @0;
  5. //旋转到180度
  6. ani.toValue = [NSNumber numberWithFloat:M_PI];
  7. //时间2S
  8. ani.duration = 2;
  9. //执行动画
  10. [layer addAnimation:ani forKey:@""];

3.CABasicAnimation属性

CABasicAnimaton是CAPropertyAnimation分出来的一个子类,创建基础的属性变化动画,例如我们上面的示例代码,其中属性如下:

  1. @property(nullable, strong) id fromValue;
  2. @property(nullable, strong) id toValue;
  3. @property(nullable, strong) id byValue;

上面三个属性都是来确定动画的起始与结束位置,有如下的含义:

fromValue和toValue不为空:动画的值由fromValue变化到toValue

fromValue和byValue不为空:动画的值由fromValue变化到fromValue+byValue

byValue和toValue不为空:动画的值由toValue-byValue变化到toValue

只有fromValue不为空:动画的值由fromValue变化到layer的当前状态值

只有toValue不为空:动画的值由layer当前的值变化到toValue

只有byValue不为空:动画的值由layer当前的值变化到layer当前的值+byValue

4.CAKeyframeAnimation关键帧动画

CAKeyframeAnimation也是继承与CAPropertyAnimation的一个子类,其与CABasicAnimation的不同之处在于虽然其都是改变layer层属性的动画,但是CABasicAnimation只能设置初始与结束状态,这之间我们没办法控制,而CAKeyframeAnimation可以让我们设置一些关键帧再整个动画的过程中。属性方法如下:

  1. //关键帧的值数组 例如我们想让控件沿某个路径移动,这里面存放每个移动的点
  2. @property(nullable, copy) NSArray *values;
  3. //直接设置路径,作用域values类似
  4. @property(nullable) CGPathRef path;
  5. //设置每一帧执行的时间长短 这个的取值为0-1,代表占用时间的比例
  6. @property(nullable, copy) NSArray<NSNumber *> *keyTimes;
  7. //每一帧执行过程中的时序效果 上面有提过
  8. @property(nullable, copy) NSArray<CAMediaTimingFunction *> *timingFunctions;
  9. /*
  10. 设置帧的中间值如何计算
  11. NSString * const kCAAnimationLinear;
  12. NSString * const kCAAnimationDiscrete;
  13. NSString * const kCAAnimationPaced;
  14. NSString * const kCAAnimationCubic;
  15. NSString * const kCAAnimationCubicPaced;
  16. */
  17. @property(copy) NSString *calculationMode;

5.CASpringAnimation阻尼动画

通过CASpringAnimation,可以帮助开发者很轻松的创建出有弹簧效果的动画,主要属性如下:

  1. //这个属性设置弹簧重物的质量 会影响惯性 必须大于0 默认为1
  2. @property CGFloat mass;
  3. //设置弹簧的刚度系数,必须大于0 默认为100 这个越大 则回弹越快
  4. @property CGFloat stiffness;
  5. //阻尼系数 默认为10 必须大于0 这个值越大 回弹的幅度越小
  6. @property CGFloat damping;
  7. //初始速度
  8. @property CGFloat initialVelocity;
  9. //获取动画停下来需要的时间
  10. @property(readonly) CFTimeInterval settlingDuration;

6.CATransition转场动画

CATransition和CAPropertyAnimation的不同之处在于当layer层出现时,会产生动画效果,而并不是属性改变时,属性如下:

  1. /*
  2. 设置动画类型
  3. //淡入
  4. NSString * const kCATransitionFade;
  5. //移入
  6. NSString * const kCATransitionMoveIn;
  7. //压入
  8. NSString * const kCATransitionPush;
  9. //溶解
  10. NSString * const kCATransitionReveal;
  11. */
  12. @property(copy) NSString *type;
  13. /*
  14. 设置动画的方向
  15. //从右侧进
  16. NSString * const kCATransitionFromRight;
  17. //从左侧进
  18. NSString * const kCATransitionFromLeft;
  19. //从上侧进
  20. NSString * const kCATransitionFromTop;
  21. //从下侧进
  22. NSString * const kCATransitionFromBottom;
  23. */
  24. @property(nullable, copy) NSString *subtype;

其实,关于type定义的动画效果,出来官方定义的,我们还可以使用一些私有的参数,如下:

  1. pageCurl 翻页
  2. rippleEffect 滴水效果
  3. suckEffect 收缩效果,如一块布被抽走
  4. cube 立方体效果
  5. oglFlip 上下翻转效果
  1. CATransition * ani = [CATransition animation];
  2. ani.type = @"pageCurl";
  3. ani.subtype = kCATransitionFromRight;
  4. [layer addAnimation:ani forKey:@""];

7.CAAnimationGroup动画组

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

  1. @property(nullable, copy) NSArray<CAAnimation *> *animations;
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注