zoukankan      html  css  js  c++  java
  • iOS开发

    Core Animation

    Core Animation。中文翻译为核心动画,它是一组很强大的动画处理API,使用它能做出很炫丽的动画效果。并且往往是事半功倍。

    也就是说,使用少量的代码就能够实现很强大的功能。
    Core Animation能够用在Mac OS X和iOS平台。


    Core Animation的动画运行过程都是在后台操作的,不会堵塞主线程。
    要注意的是,Core Animation是直接作用在CALayer上的,并不是UIView。


    乔帮主在2007年的WWDC大会上亲自为你演示Core Animation的强大

    假设是xcode5之前的版本号,使用它须要先加入QuartzCore.framework和引入相应的框架<QuartzCore/QuartzCore.h>
    开发步骤:
    1.使用它须要先加入QuartzCore.framework框架和引入主头文件<QuartzCore/QuartzCore.h>
    2.初始化一个CAAnimation对象。并设置一些动画相关属性
    3.通过调用CALayer的addAnimation:forKey:方法添加CAAnimation对象到CALayer中。这样就能開始运行动画了
    4.通过调用CALayer的removeAnimationForKey:方法能够停止CALayer中的动画
    

    CAAnimation继承结构

    注意:图中的黑色虚线代表“继承”某个类,红色虚线代表“遵守”某个协议

    这里写图片描写叙述

    CAAnimation简单介绍

    是全部动画对象的父类,负责控制动画的持续时间和速度,是个抽象类。不能直接使用,应该使用它详细的子类
    属性说明:(红色代表来自CAMediaTiming协议的属性)
    duration:动画的持续时间
    repeatCount:反复次数,无限循环能够设置HUGE_VALF或者MAXFLOAT
    repeatDuration:反复时间
    removedOnCompletion:默觉得YES,代表动画运行完成后就从图层上移除。图形会恢复到动画运行前的状态。假设想让图层保持显示动画运行后的状态。那就设置为NO,只是还要设置fillMode为kCAFillModeForwards
    fillMode:决定当前对象在非active时间段的行为。比方动画開始之前或者动画结束之后
    beginTime:能够用来设置动画延迟运行时间。若想延迟2s。就设置为CACurrentMediaTime()+2,CACurrentMediaTime()为图层的当前时间
    timingFunction:速度控制函数,控制动画运行的节奏
    delegate:动画代理

    CAAnimation动画填充模式

    fillMode属性值(要想fillMode有效,最好设置removedOnCompletion = NO)

    kCAFillModeRemoved 这个是默认值,也就是说当动画開始前和动画结束后。动画对layer都没有影响。动画结束后。layer会恢复到之前的状态
    kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态
    kCAFillModeBackwards 在动画開始前。仅仅须要将动画加入了一个layer,layer便马上进入动画的初始状态并等待动画開始。
    kCAFillModeBoth 这个事实上就是上面两个的合成.动画加入后開始之前。layer便处于动画初始状态,动画结束后layer保持动画最后的状态

    CAAnimation速度控制函数

    速度控制函数(CAMediaTimingFunction) 
    kCAMediaTimingFunctionLinear(线性):
    //匀速,给你一个相对静态的感觉
    kCAMediaTimingFunctionEaseIn(渐进):
    //动画缓慢进入,然后加速离开
    kCAMediaTimingFunctionEaseOut(渐出):
    //动画全速进入,然后减速的到达目的地
    kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):
    //动画缓慢的进入,中间加速。然后减速的到达目的地。

    这个是默认的动画行为。

    CAAnimation动画代理方法

    CAAnimation在分类中定义了代理方法
    
    @interface NSObject (CAAnimationDelegate)
    
    /* Called when the animation begins its active duration. */
    
    - (void)animationDidStart:(CAAnimation *)anim;
    
    - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
    
    @end
    

    CALayer上动画的暂停和恢复

    -(void)pauseLayer:(CALayer*)layer
    {
        CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    
        // 让CALayer的时间停止走动
          layer.speed = 0.0;
        // 让CALayer的时间停留在pausedTime这个时刻
        layer.timeOffset = pausedTime;
    }
    
    #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;
    }
    

    CAPropertyAnimation

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

    属性说明:
    keyPath:通过指定CALayer的一个属性名称为keyPath(NSString类型),并且对CALayer的这个属性的值进行改动,达到相应的动画效果。

    比方,指定@“position”为keyPath。就改动CALayer的position属性的值,以达到平移的动画效果

    CABasicAnimation基本动画

    基本动画,是CAPropertyAnimation的子类

    属性说明:
    fromValue:keyPath相应属性的初始值
    toValue:keyPath相应属性的结束值

    动画过程说明:
    随着动画的进行。在长度为duration的持续时间内。keyPath相应属性的值从fromValue渐渐地变为toValue
    keyPath内容是CALayer的可动画Animatable属性
    假设fillMode=kCAFillModeForwards同一时候removedOnComletion=NO。那么在动画运行完成后,图层会保持显示动画运行后的状态。但在实质上。图层的属性值还是动画运行前的初始值。并没有真正被改变。

    CAKeyframeAnimation关键帧动画

    关键帧动画,也是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

    CAAnimationGroup动画组

    动画组,是CAAnimation的子类。能够保存一组动画对象,将CAAnimationGroup对象加入层后,组中全部动画对象能够同一时候并发运行

    属性说明:
    animations:用来保存一组动画对象的NSArray
    默认情况下,一组动画对象是同一时候运行的。也能够通过设置动画对象的beginTime属性来更改动画的開始时间

    CATransition转场动画

    CATransition是CAAnimation的子类。用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。

    iOS比Mac OS X的转场动画效果少一点
    UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果
    动画属性:
    type:动画过渡类型
    subtype:动画过渡方向
    startProgress:动画起点(在总体动画的百分比)
    endProgress:动画终点(在总体动画的百分比)

    转场动画过渡效果

    这里写图片描写叙述

    使用UIView动画函数实现转场动画 单视图

    + (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;
    
    參数说明:
    //duration:动画的持续时间
    //view:须要进行转场动画的视图
    //options:转场动画的类型
    //animations:将改变视图属性的代码放在这个block中
    //completion:动画结束后,会自己主动调用这个block
    

    使用UIView动画函数实现转场动画 双视图

    + (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion;
    
    參数说明:
    //duration:动画的持续时间
    //options:转场动画的类型
    //animations:将改变视图属性的代码放在这个block中
    //completion:动画结束后。会自己主动调用这个block
    

    CADisplayLink是一种以屏幕刷新频率触发的时钟机制,每秒钟运行大约60次左右
    CADisplayLink是一个计时器,能够使画图代码与视图的刷新频率保持同步,而NSTimer无法确保计时器实际被触发的准确时间
    用法:
    定义CADisplayLink并制定触发调用方法
    将显示链接加入到主运行循环队列

  • 相关阅读:
    BlackBerry Localiztion Websites
    BlackBerry device debug
    (收藏)Android VoIP
    How to access the folder of Android
    listView高度控制 底部tabhost标签 用android:layout_below="@+id/tab_all"
    自定义TabHost,TabWidget样式 .
    点击TextView 弹出复制选项
    如何实现验证两次输入的密码是否一致
    Android 获取SDCard上图片和视频的缩略图
    去掉activity(tabhost )顶部的gradient 黑线 横线 阴影
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7382792.html
Copyright © 2011-2022 走看看