Core Animation-核心动画

一.Core Animation框架

  • iOS动画主要是指Core Animation框架。Core Animation是iOS和
    macOS平台上负责图形渲染与动画的基础框。

  • Core Animation可以作用于动画视图或者其他可视元素,为你完成动画所需的大部分绘帧工作

  • 你只需要配置少量的动画参数(如开始点的位置和结束点的位置)即可使用Core Animation的动画效果

  • Core Animation将大部分实际的绘图任务交给了图形硬件来处理,图形硬件会加速图形渲染的速度。这种自动化的图形加速技术让动画拥有更高的帧
    率并且显示效果更加平滑,不会加重CPU的负担而影响程序的运行速度

  • 要注意的是,Core Animation是直接作用在CALayer上的,并非UIView

继承关系与遵守的协议

二.CAAnimation---所有动画对象的父类

负责控制动画的持续时间和速度,是个抽象类,不能直接使用,应该使用它具体的子类
属性说明:(带*号代表来自CAMediaTiming协议的属性)

*duration:动画的持续时间
*repeatCount:重复次数,无限循环可以设置HUGE_VALF或者MAXFLOAT
*repeatDuration:重复时间

removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwards

*fillMode:决定当前对象在非active时间段的行为。比如动画开始之前或者动画结束之后

*beginTime:可以用来设置动画延迟执行时间,若想延迟2s,就设置为CACurrentMediaTime()+2,CACurrentMediaTime()为图层的当前时间

delegate:动画代理

####CAAnimation——动画代理方法
//CAAnimation在分类中定义了代理方法,是给NSObject添加的分类,所以任何对象,成为CAAnimation的代理都可以
@interface NSObject (CAAnimationDelegate)

//动画开始的时候调用
- (void)animationDidStart:(CAAnimation *)anim;

//动画停止的时候调用
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

@end

//CALayer上动画的暂停
#pragma mark 暂停CALayer的动画
-(void)pauseLayer:(CALayer*)layer{
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() 
                                                              fromLayer:nil];
    //让CALayer的时间停止走动
    layer.speed = 0.0;
    //让CALayer的时间停留在pausedTime这个时刻
    layer.timeOffset = pausedTime;
}

//CALayer上动画的恢复
#pragma mark 恢复CALayer的动画
-(void)resumeLayer:(CALayer*)layer{

   CFTimeInterval pausedTime = layer.timeOffset;

   //1. 让CALayer的时间继续行走
   layer.speed = 1.0;

   //2. 取消上次记录的停留时刻
   layer.timeOffset = 0.0;

   //3. 取消上次设置的时间
   layer.beginTime = 0.0;

   //4. 计算暂停的时间(这里也可以用CACurrentMediaTime()-pausedTime)
   CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;

   //5. 设置相对于父坐标系的开始时间(往后退timeSincePause)
   layer.beginTime = timeSincePause;
}

timingFunction:速度控制函数,控制动画运行的节奏

typedef enum {
  kCAMediaTimingFunctionLinear,  //(线性):匀速,给你一个相对静态的感觉
  kCAMediaTimingFunctionEaseIn,  //(渐进):动画缓慢进入,然后加速离开
  kCAMediaTimingFunctionEaseOut,  //(渐出):动画全速进入,然后减速的到达目的地
  kCAMediaTimingFunctionEaseInEaseOut //(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。
} kCAMediaTimingFunction;

//设置动画的执行节奏
animation.timingFunction = [CAMediaTimingFunction
                           functionWithName:kCAMediaTimingFunctionLinear];

三.CAPropertyAnimation

CAPropertyAnimation是CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使用它的两个子类:

  • CABasicAnimation-基本动画
  • CAKeyframeAnimation-关键帧动画

四.CABasicAnimation-基本动画

keyPath:要改变的属性名称(传字符串)

fromValue:keyPath相应属性的初始值

toValue:keyPath相应属性的结束值

动画过程说明:随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值从fromValue渐渐地变为toValuekey

如果fillMode=kCAFillModeForwards同时removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。

CABasicAnimation可以改变的属性名称
CABasicAnimation简单的例子
  • KVC---Key Value Coding
    多用于系统的类,如果某个类里面有些成员变量,但是这些成员变量外部又无法访问,可以使用KVC强制访问
  • KVO---Key Value Observing
    用于监听属性的变化,不常用
kvc与kvo

五.CAKeyframeAnimation-关键帧动画

  • 提供关键帧数据的数组,数组中的每一个值都对应一个关键帧。根据动画类型 (keyPath)的不同 ,值的类型不同
@property(nullable, copy) NSArray *;
  • keyTimes的值与values中的值一一对应指定关键帧在动画中的时间点,取值范围为 [0,1]。当keyTimes没有设置的时候,各个关键帧的时间是平分的
@property(nullable, copy) NSArray *keyTimes;
  • 指定每个关键帧之间的动画缓冲效果
@property(nullable, copy) NSArray *timingFunctions;
  • 关键帧间插值计算模式
@property(copy) NSString *calculationMode;
  • 控制曲线的“紧密度”(正值更紧,负值更圆)
tensionValues
  • 控制段的连接方式(正值表示锐角 ,负值表示倒角 )
continuityValues
  • 定义曲线发生的位置(正值在控制点之前移动曲线,负值在控制点之后移动它)
biasValues
  • path只能控制CGPoint类型的动画属性。如position、anchorPoint、 transform.translation移动它
path的获取
画圆的Angle

关键帧动画,也是CAPropertyAnimation的子类,与CABasicAnimation的区别是:CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSArray保存这些数值

属性说明:values:上述的NSArray对象。里面的元素称为“关键帧”(keyframe)。动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧

path:代表路径可以设置一个CGPathRef、CGMutablePathRef,让图层按照路径轨迹移动。path只对CALayer的anchorPoint和position起作用。如果设置了path,那么values将被忽略

keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧。如果没有设置keyTimes,各个关键帧的时间是平分的

CABasicAnimation可看做是只有2个关键帧的CAKeyframeAnimation

六.CATransition-转场动画

CATransition是CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点

UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果

动画属性:(有的属性是具备方向的,详情看下图)

type:动画过渡类型

subtype:动画过渡方向

startProgress:动画起点(在整体动画的百分比)

endProgress:动画终点(在整体动画的百分比)

image

转场动画过渡效果.png

CATransition *anim = [CATransition animation];

转场类型

anim.type = @"cube";

动画执行时间

anim.duration = 0.5;

动画执行方向

anim.subtype = kCATransitionFromLeft;

添加到View的layer

[self.redView.layer addAnimation:anim forKey];

七.CAAnimationGroup——动画组

动画组,是CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行

属性说明:

animations:用来保存一组动画对象的NSArray

默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间

组动画

八.CAShapeLayer

CAShapeLayer属于QuartzCore框架,继承自CALayer。CAShapeLayer是在坐标系内绘制贝塞尔曲线的,通过绘制贝塞尔曲线,设置shape(形状)的path(路径),从而绘制各种各样的图形以及不规则图形。因此,使用CAShapeLayer需要与UIBezierPath一起使用。
UIBezierPath类允许你在自定义的 View 中绘制和渲染由直线和曲线组成的路径.。你可以在初始化的时候直接为你的UIBezierPath指定一个几何图形。
通俗点就是UIBezierPath用来指定绘制图形路径,而CAShapeLayer就是根据路径来绘图的。

CAShapeLayer的属性
CAShapeLayer画不规则的图
CAShapeLayer上面的动画

你可能感兴趣的:(Core Animation-核心动画)