iOS核心动画高级技巧——图层树

962 阅读3分钟

图层树

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基于UIViewCALayer提供两个平行的层级关系,原因在于要做职责分离,这样也能避免很多重复代码。

实际上,这里不是两个层级关系,而是四个,除了视图层级和图层树之外,还存在呈现树渲染树,之后会讨论到。

图层的能力

这里有一些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层级关系。