IOS动画(CALayer、CoreAnimation简介)

IOS动画(CALayer、CoreAnimation简介)


一。CALayer

优点:

  • 每个UIView上都可以放置几百个CALayer
  • Core Animation动画在单独的线程总完成,不会阻塞主线程
  • Core Animation动画只重绘界面上变化的部分

提供的方法:

  • addAnimation:forKey: 添加一个动画并制定对应的key
  • animationForKey:执行key对应的动画
  • removeAllAnimations:删除该CALayer上添加的所有动画
  • removeAnimationForKey: 删除key对应的动画
  • animationKeys:获取所有动画key组成的数组
  • presentationLayer:获取calayer的表现层
    • 对于presentationLayer,这个属性不一定总会返回一个实体对象,只有当进行动画或者其他渲染的操作时,这个属性会返回一个在当前屏幕上的layer
    • 并且每一次执行,这个对象都会不同,它是原layer的一个副本
    • 可以用来获取当前动画的改变中属性的实时值

二。相关类

  • CAAnimation :所有动画类的基类
    • 实现CAMediaTiming协议,提供了动画的持续时间 、速度和重复计数
    • 实现CAAction协议,为动画触发的动画提供标准化响应
  • CATransition
    • 可通过预设的过渡效果来控制CALayer层的过渡效果。
  • CAPropertyAnimation(CABasicAnimation 和 CAKeyframeAnimation 的父类)
    • 代表属性动画。 可以通过 animationWithKeyPath: 类方法来创建属性动画实例。
  • CABasicAnimation
    • 简单控制CALayer层的属性慢慢变化。
  • CAKeyframeAnimation
    • 支持关键帧的属性动画,该动画最大的特点在于可通过values属性指定多个关键帧,通过多个关键帧可以指定动画的各阶段的关键值。
  • CAAnimationGroup
    • 用于将 多个动画组合在一起执行。

继承关系图:


三。 CAAnimation 提供的属性和方法

CAAnimation 提供的属性和方法

  • removedOnCompletion:该属性用于指定该动画完成时是否从目标CALayer上删除该动画
  • timingFunction: 该属性用于指定一个CAMediaTimingFunction对象,该对象负责控制动画变化的步长。
  • animationDidStart:(CAAnimation*)theAnimation: 该动画开始时将会调用
  • animationDidStop:(CAAnimation*)theAnimation finished:(BOOL)flag: 该动画结束时会调用

CAMediaTiming:提供的属性和方法

  • duration: 动画继续时间,默认0
  • repeatCount: 动画重复次数 默认0
  • fillMode: 决定当前对象在非active时间段的行为.比如动画开始之前,动画结束之后,有四个值:
    • kCAFillModeForwards:当动画结束后,layer会一直保持着动画最后的状态
    • kCAFillModeBackwards:就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始
    • kCAFillModeBoth:动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.
    • kCAFillModeRemoved :这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态

注意:如果是一个动画CAAnimation,则需要将其removedOnCompletion设置为NO,要不然fillMode不起作用.


四。 CATransition控制过渡动画

  • type 属性用于控制动画类型
    • KCATransitionFade:渐隐效果(默认)
    • KCATransitionMoveIn:移入动画
    • KCATransitionPush:推入动画
    • KCATransitionReveal:揭开动画
    • cube :立方体旋转
    • suckEffect :收缩动画
    • oglFlip :翻转
    • rippleEffect : 水波
    • pageCurl : 页面揭开
    • pageUnCurl :放下页面
    • cameraIrisHollowOpen : 镜头打开动画
    • cameraIrisHollowClose : 镜头关闭
  • subyte 属性用于指定动画的移动方向
    • kCATransitionFromRight
    • kCATransitionFromLeft
    • kCATransitionFromTop
    • kCATransitionFromBottom
  • startProgressendProgress 控制动画开始和结束的时间

示例:(移入动画)

CATransition *transition = [CATransition animation];
transition.duration = 2.0f;
// 使用kCATransitionMoveIn动画
transition.type = kCATransitionMoveIn;
// 指定动画方向,从左向右
transition.subtype = kCATransitionFromLeft;
[self.view.layer addAnimation:transition forKey:@"animation"];

五。 属性动画(CABasicAnimation、CAKeyframeAnimation)

CAPropertyAnimation 提供的属性以及方法

  • animationWithKeyPath: 根据参数指定的CALayer属性来进行动画

5.1 CABasicAnimation

CABasicAnimation 提供的属性方法

  • fromValue、toValue:分别指定动画属性开始时的属性值和动画属性结束时的属性值

示例:改变背景颜色

    CABasicAnimation* cocorAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
    CGColorRef beforeColor = self.notiScanLabel.layer.backgroundColor;
    CGColorRef afterColor = c.CGColor;
    
    cocorAnimation.fromValue = (__bridge id)beforeColor;
    cocorAnimation.toValue = (__bridge id)afterColor;
    
    cocorAnimation.duration = 0.8;
    cocorAnimation.removedOnCompletion = true;
    cocorAnimation.fillMode = kCAFillModeForwards;
    [self.notiScanLabel.layer addAnimation:cocorAnimation forKey:@"cocorAnimation"];

5.2 CAKeyframeAnimation

CAKeyframeAnimation提供的属性方法

  • values : 可以指定动画过程中的多个值

示例:改变位置

 CAKeyframeAnimation *shakeAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
shakeAnim.values = [NSArray arrayWithObjects:
                   	[NSValue valueWithCGPoint: position1],
						[NSValue valueWithCGPoint: position2],
                   	[NSValue valueWithCGPoint:self.layer.position],nil];
shakeAnim.duration = totalInterval ;
[self.someview addAnimation: shakeAnim forKey:@"shakeAnim"];
原文地址:https://www.cnblogs.com/sunyanyan/p/5279237.html