图层树
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
层级关系。