巨妖有图层,洋葱也有图层,你有吗?咱们都有图层 -- 史莱克 git
Core Animation实际上是一个使人误解的命名。你可能认为它只是用来作动画的,但实际上它是从一个叫作Layer Kit这么一个不怎么和动画有关的名字演变而来,因此作动画这只是Core Animation特性的冰山一角。 github
Core Animation是一个复合引擎,它的职责就是尽量快地组合屏幕上不一样的可视内容,这个内容是被分解成独立的图层,存储在一个叫作图层树的体系之中。因而这个树造成了UIKit以及在iOS应用程序当中你所能在屏幕上看见的一切的基础。 框架
在咱们讨论动画以前,咱们将从图层树开始,涉及一下Core Animation的静态组合以及布局特性。 布局
若是你曾经在iOS或者Mac OS平台上写过应用程序,你可能会对视图的概念比较熟悉。一个视图就是在屏幕上显示的一个矩形块(好比图片,文字或者视频),它可以拦截相似于鼠标点击或者触摸手势等用户输入。视图在层级关系中能够互相嵌套,一个视图能够管理它的全部子视图的位置。图1.1显示了一种典型的视图层级关系 性能
图1.1 一种典型的iOS屏幕(左边)和造成视图的层级关系(右边) 动画
在iOS当中,全部的视图都从一个叫作UIVIew的基类派生而来,UIView能够处理触摸事件,能够支持基于Core Graphics绘图,能够作仿射变换(例如旋转或者缩放),或者简单的相似于滑动或者渐变的动画。 spa
CALayer类在概念上和UIView相似,一样也是一些被层级关系树管理的矩形块,一样也能够包含一些内容(像图片,文本或者背景色),管理子图层的位置。它们有一些方法和属性用来作动画和变换。和UIView最大的不一样是CALayer不处理用户的交互。 视频
CALayer并不清楚具体的响应链(iOS经过视图层级关系用来传送触摸事件的机制),因而它并不可以响应事件,即便它提供了一些方法来判断是否一个触点在图层的范围以内(具体见第三章,“图层的几何学”) 接口
每个UIview都有一个CALayer实例的图层属性,也就是所谓的backing layer,视图的职责就是建立并管理这个图层,以确保当子视图在层级关系中添加或者被移除的时候,他们关联的图层也一样对应在层级关系树当中有相同的操做(见图1.2)。 事件
图1.2 图层的树状结构(左边)以及对应的视图层级(右边)
实际上这些背后关联的图层才是真正用来在屏幕上显示和作动画,UIView仅仅是对它的一个封装,提供了一些iOS相似于处理触摸的具体功能,以及Core Animation底层方法的高级接口。
可是为何iOS要基于UIView和CALayer提供两个平行的层级关系呢?为何不用一个简单的层级来处理全部事情呢?缘由在于要作职责分离,这样也能避免不少重复代码。在iOS和Mac OS两个平台上,事件和用户交互有不少地方的不一样,基于多点触控的用户界面和基于鼠标键盘有着本质的区别,这就是为何iOS有UIKit和UIView,可是Mac OS有AppKit和NSView的缘由。他们功能上很类似,可是在实现上有着显著的区别。
绘图,布局和动画,相比之下就是相似Mac笔记本和桌面系列同样应用于iPhone和iPad触屏的概念。把这种功能的逻辑分开并应用到独立的Core Animation框架,苹果就可以在iOS和Mac OS之间共享代码,使得对苹果本身的OS开发团队和第三方开发者去开发两个平台的应用更加便捷。
实际上,这里并非两个层级关系,而是四个,每个都扮演不一样的角色,除了视图层级和图层树以外,还存在呈现树和渲染树,将在第七章“隐式动画”和第十二章“性能调优”分别讨论。