图层树
Core Animation 其实是从Layer Kit这么一个不怎么和动画有关的名字演变而来,所以做动画只是Core Animation特性的冰山一角。
Core Animation是一个复合引擎,它的职责就是尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的图层,存储在一个叫做图层树的体系之中。于是这个树形成了UIKit以及在iOS应用程序当中你所能在屏幕上看见的一切的基础。
图层与视图
视图在层级关系中可以相互嵌套,一个视图可以管理它的所有子视图的位置。
在iOS当中,所有的视图都从一个叫做UIView的基类派生而来,UIView可以处理触摸事件,可以支持基于Core Graphics绘图,可以做仿射变换(例如旋转或者缩放),或者简单的类似于滑动或者渐变的动画。
CALayer
和UIView最大的不同是CALayer不处理用户的交互。
CALayer并不清楚具体的响应链(iOS通过视图层级关系用来传送触摸事件的机制),于是它并不能够响应事件。
平行的层级关系
每一个UIView都有一个CALayer实例的图层属性,也就是所谓的backing layer。
实际上这些背后关联的图层才是真正用来在屏幕上显示和做动画,UIView仅仅是对它的一个封装,提供了一些iOS类似于处理触摸的具体功能,以及Core Animation底层方法的高级接口。
iOS基于UIView和CALayer提供两个平行的层级关系,原因在于要做职责分离,这样也能避免很多重复代码。
实际上,这里不是两个层级关系,而是四个,除了视图层级和图层树之外,还存在呈现树和渲染树,之后会讨论到。
图层的能力
这里有一些UIView没有暴露出来的CALayer的功能:
-
阴影,圆角,带颜色的边框
-
3D变换
-
非矩形范围
-
透明遮罩
-
多级非线性动画
使用图层
使用图层关联的视图而不是CALayer的好处在于,你能在使用所有CALayer底层特性的同时,也可以使用UIView的高级API(比如自动排版,布局和事件处理)。
然而,当满足以下条件的时候,你可能更需要使用CALayer而不是UIView
-
开发同时可以在Mac OS上运行的跨平台应用
-
使用多种
CALayer的子类,并且不想创建额外的UIView去包封装它们所有 -
做一些对性能特别挑剔的工作,比如对
UIView一些可忽略不计的操作都会引起显著的不同(尽管如此,你可能会直接想使用OpenGL绘图)Metal was introduced in 2014 as a general purpose API for GPU-based computation. In 2018, Apple deprecated OpenGL in iOS 12 for both iOS and macOS.
总结
这一章阐述了图层的树状结构,说明了如何在iOS中由UIView的层级关系形成的一种平行的CALayer层级关系。