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

CADisplayLink是一种以屏幕刷新频率触发的时钟机制,每秒钟运行大约60次左右

CADisplayLink是一个计时器,能够使画图代码与视图的刷新频率保持同步,而NSTimer无法确保计时器实际被触发的准确时间

用法:

定义CADisplayLink并制定触发调用方法

将显示链接加入到主运行循环队列

iOS开发 - Core Animation 核心动画的更多相关文章

  1. iOS - Core Animation(核心动画)

    Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能.Core An ...

  2. iOS - Core Animation 核心动画

    1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...

  3. iOS开发UI篇—核心动画简介

    转自:http://www.cnblogs.com/wendingding/p/3801036.html iOS开发UI篇—核心动画简介 一.简单介绍 Core Animation,中文翻译为核心动画 ...

  4. iOS开发UI篇—核心动画(UIView封装动画)

    iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...

  5. iOS开发UI篇—核心动画(转场动画和组动画)

    转自:http://www.cnblogs.com/wendingding/p/3801454.html iOS开发UI篇—核心动画(转场动画和组动画) 一.转场动画简单介绍 CAAnimation的 ...

  6. iOS开发UI篇—核心动画(关键帧动画)

    转自:http://www.cnblogs.com/wendingding/p/3801330.html iOS开发UI篇—核心动画(关键帧动画) 一.简单介绍 是CApropertyAnimatio ...

  7. iOS开发UI篇—核心动画(基础动画)

    转自:http://www.cnblogs.com/wendingding/p/3801157.html 文顶顶 最怕你一生碌碌无为 还安慰自己平凡可贵 iOS开发UI篇—核心动画(基础动画) iOS ...

  8. iOS开发基础知识:Core Animation(核心动画)

    Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能. Core A ...

  9. iOS - Core Animation 核心动画的使用

    1.简单使用示例 1.1 时钟 QClockView.h @interface QClockView : UIView /// 创建时钟界面 + (instancetype)q_clockViewWi ...

随机推荐

  1. spring mvc改动配置文件路径

    1.1.  Classpath project文件夹 在web.xml文件例如以下配置: <!-- 配置spring mvc 的核心servlet --> <servlet> ...

  2. 多个Jar的合并操作

    同事要写Android平台下的打包工具,遇到需要将多个jar合并成一个jar的问题.这里列一下操作步骤: 1.将所有jar文件复制至某临时目录中,通过jar命令解压得到所有的.class文件 > ...

  3. [转]php rsa加密解密实例

    转自:http://blog.csdn.net/clh604/article/details/20224735 php服务端与客户端交互.提供开放api时,通常需要对敏感的部分api数据传输进行数据加 ...

  4. 分析器错误消息: 未能找到 CodeDom 提供程序类型

    ylbtech-Error-WebForm:分析器错误消息: 未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatfor ...

  5. Mockito 中被 Mocked 的对象属性及方法的默认值

    在 Java 测试中使用 Mockito 有段时日了,以前只是想当然的认为 Mock 的对象属性值和方法返回值都是依据同样的规则.基本类型是 0, 0.0, 或 false, 对象类型都是 null, ...

  6. source insight 4.0.086破解

     source insight 4.0.093 破解: 1. 安装原版软件:Source Insight Version 4.0.0093 - March 20, 2018 2. 替换原主程序:sou ...

  7. go语言之进阶篇 channel介绍

    1.channel介绍 和map类似,channel也一个对应make创建的底层数据结构的引用. 当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者何被 ...

  8. $.getJSON的缓存问题处理

    今天遇到jQuery.getJSON的缓存问题.如果其调用的url之前曾经调用过的话,回调函数就会直接在缓存里面取得想要得值,而不是进入到后台,调用存储过程了.这是一个比较郁闷的问题.不修改的话,用户 ...

  9. [leetcode]Maximum Subarray @ Python

    原题地址:https://oj.leetcode.com/problems/maximum-subarray/ 题意: Find the contiguous subarray within an a ...

  10. ASP.NET网站管理工具的【安全】功能无法使用问题

    在使用ASP.NET网站管理工具时,安全出现下面的问题: 出现这种情况的主要原因是,安全管理中需要创建用户和角色信息,所以要用到数据库,但是你没有设置好数据库. 可以打开vs自带的命令提示工具: 打开 ...