iOS开发 - Core Animation 核心动画
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 核心动画的更多相关文章
- iOS - Core Animation(核心动画)
Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能.Core An ...
- iOS - Core Animation 核心动画
1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...
- iOS开发UI篇—核心动画简介
转自:http://www.cnblogs.com/wendingding/p/3801036.html iOS开发UI篇—核心动画简介 一.简单介绍 Core Animation,中文翻译为核心动画 ...
- iOS开发UI篇—核心动画(UIView封装动画)
iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...
- iOS开发UI篇—核心动画(转场动画和组动画)
转自:http://www.cnblogs.com/wendingding/p/3801454.html iOS开发UI篇—核心动画(转场动画和组动画) 一.转场动画简单介绍 CAAnimation的 ...
- iOS开发UI篇—核心动画(关键帧动画)
转自:http://www.cnblogs.com/wendingding/p/3801330.html iOS开发UI篇—核心动画(关键帧动画) 一.简单介绍 是CApropertyAnimatio ...
- iOS开发UI篇—核心动画(基础动画)
转自:http://www.cnblogs.com/wendingding/p/3801157.html 文顶顶 最怕你一生碌碌无为 还安慰自己平凡可贵 iOS开发UI篇—核心动画(基础动画) iOS ...
- iOS开发基础知识:Core Animation(核心动画)
Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能. Core A ...
- iOS - Core Animation 核心动画的使用
1.简单使用示例 1.1 时钟 QClockView.h @interface QClockView : UIView /// 创建时钟界面 + (instancetype)q_clockViewWi ...
随机推荐
- 一分钟了解:String & StringBuilder & StringBuffer
这三个都是字符串对象,本篇就来分析下它们的使用途径,力求简单明了. 一.String String 长度是不可变的,如果你要改变string对象的字符或者是拼接字符的话,系统就会新建一个string, ...
- Eclipse设置方法模板
我们在项目中进行代码书写的时候,对个人所写的代码打上个人的标签的话,这样便于后期代码的维护跟踪,好处多多. 设置注释模板的入口: Window->Preference->Java-> ...
- 使用kubectl创建部署
本文使用自己利用VirtubalBox搭建的集群环境,暂时只有一个Master.一个Node.如果想了解集群的搭建,可以参考我的文章离线环境安装Kubernetes集群以及使用kubeadm安装kub ...
- 5句mysql语句
显示表的结构: mysql> DESCRIBE MYTABLE; 往表中加入记录 mysql> insert into MYTABLE values ("hyq",&q ...
- IDEA 快速将spring boot项目打包成jar包,简单快速有效
原文地址;https://blog.csdn.net/chen846262292/article/details/80701101 https://www.cnblogs.com/chrischen ...
- Useful JVM Flags – Part 8 (GC Logging)
The last part of this series is about garbage collection logging and associated flags. The GC log is ...
- ASP.NET MVC:UrlHelper.cs
ylbtech-funcation-Utility: ASP.NET MVC:UrlHelper.cs 充当表示 ASP.NET Razor 页的类的基类. 1.UrlHelper 类返回顶部 1-1 ...
- RV32A指令集
RV32A指令包括两类:AMO(atomic memory operation)指令,Load-Reserved/Store-Conditional指令 Category Fmt RV32I base ...
- SpringMVC request生命周期
When the request leaves the browser, it carries information about what the user is asking for. At ve ...
- 样条之贝塞尔(Bezier)
我曾经发过两篇关于贝塞尔的文章:数学图形(1.47)贝塞尔(Bézier)曲线,数学图形之贝塞尔(Bézier)曲面.那是使用我自己定义的脚本语言生成贝塞尔图形.由于我自己定义的脚本语法功能有限,所以 ...