美文网首页iOS
Core Animation-核心动画

Core Animation-核心动画

作者: 小石头呢 | 来源:发表于2019-03-19 08:22 被阅读75次

    一.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-核心动画

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