在上一编(视图动画) 已经简单的介绍了iOS的动画,UIView Animation是UIKit框架基于Core Animation 封装的一个动画API,依框架封装的初衷就是让功能实现更简单、更快捷,但有利必有弊,再次封装的接口只是为了某一特定需求而做的,折损了原有的可塑造性。所以实现一些更细腻、更酷炫的动画就需要了解Core Animation框架
有一个很形象的比喻来理解核心动画:
动画就是一部电影,CALayer是演员,CAAnimation是电影剧本,而把CAAnimation添加到CALayer就是播放电影
重要的角色 CALayer
说到动画就必须提到CALayer,那么什么是CALayer,到底有什么作用?
根据官方介绍
大致意思是:CALayer类是负责管理图像内容和动画的执行
其实在开发中,我们能看得见摸得着的UIButton、UILabel、UITextView等等,都是UIView,但是UIView能够显示是因为其内部包含一个layer 属性。在创建UIView对象时,UIView内部就会自动创建一个CALayer图层,通过self.view.layer可以访问到这个图层。当UIView要显示到屏幕上时,就会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的layer图层,绘图完毕后,系统会将图层拷贝到屏幕上,完成UIView的显示。这里就说说UIView与CALayer的区别:UIView是负责响应事件(继承于UIResponder),CALayer是负责内容渲染显示以及动画的执行,从某种意义来说UIView可以算是一个特殊的CALayer。(这里深深体会到OC三个特性对于编程的重要:继承、封装和多态,将不同的功能封装到不同的类中,各执其职,清楚明了)
CALayer的常用属性backgroundColor、border、cornerRadius、shadow。
Snip20161030_2.png
Snip20161030_3.png
Snip20161030_4.png
创建CALayer对象
+ (instancetype)layer;
- (instancetype)initWithLayer:(id)layer;
- (instancetype)init;
讲完CALayer,介绍主角核心动画:Core Animation
Core Animation 的动画执行过程都是在后台操作的,不会柱塞主线程,并且Core Animation是直接作用在CALayer上的。以下Core Animation的类继承结构
CAAnimation是所有动画类的父类,但是它不能直接使用,只能事业它的子类,包括CAAnimationGroup、CABasicAnimation、CAKeyFrameAnimation、CATransition。
常用的属性说明:
duration:动画的持续时间
repeatCount:动画的重复次数
repeatDuration:动画重复的时间
removedOnCompletion:默认是YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为看CAFillModeForwards
fillMode:决定当前对象在非active时间段的行为,比如动画开始之前,动画结束之后
beginTime:可以用来设置动画延迟执行时间,若想延迟2S,就设置为CAurrentMediaTime()+2,CACurrentMediaTime()为图层的当前时间
timingFunction:速度控制函数,控制动画运行的节奏
delegate:动画代理
网友评论