The Layer Tree

来源:互联网 发布:什么是数据的树形结构 编辑:程序博客网 时间:2024/04/28 17:37
妖怪也有层次。洋葱有层次。你明白吗?我们都有层次。——史莱克

Core Animation 这个命名是有误的,你可能会认为它的主要目的是动画,但这个库实际上动画只是一个方面而已,最初就因为少量动画为中心而被命名为LayerKit。

Core Animation 是一个图像合成的引擎,它的工作就是将不同的图像内容输出在屏幕上,并且尽可能快得完成。这个问题的核心在于将内容分开到单独的layers然后分层储存起来如何一颗layer tree(层树?)。这棵树形成了UIKit的基础,和你的APP所能在屏幕上看到的一切。

在我们讨论动画之前,我们先简述Core Animation 的静态和成和布局特点,就从这颗layer tree开始。


层和视图

如果你曾经建立一个iOS或者MacOS的app,你会对视图(view)的概念很熟悉。视图就是显示内容(如图像、文字或视频)的矩形对象,并接收用户的输入如鼠标点击或者点击手势。视图可以各自嵌套,形成一种层次结构。其中每个视图管理其孩子(子视图)的位置。图1.1展现了典型的分层结构视图关系。


图1.1一个典型iOS屏幕(左)和层级关系(右)

在iOS中,视图都是继承自UIView这个公共基类。UIView处理触摸事件和支持Core Graphics为基础的绘图,映射变换(例如旋转和缩放),以及简单的动画如滑动和褪色。
你可能还没意识到是UIView并不处理大多数这些任务,渲染,排版和动画都是由Core Animation 进行管理,名为CALayer。

CALayer
CALayer类在概念上与UIView很相似。Layers(层),如何views(视图)都是可以被布置成树形态的矩形对象。如何views,它们也可以包含内容(如何图像、文字和背景色)以及管理它们的位置和孩子(sublayers)。它们有用于执行动画和变换的方法和属性。UIView的唯一特点就是不通过CALayer处理用户的交互。
——————————————————————2014.3.15.1:39——————————————————
CALayer并不是响应链(即iOS用于在视图层之中传递触摸事件的机制)中的一部分。所以不能响应事件,但它确实提供了一些方法来帮助确定一个特定的触摸点是否是层的范围内(关于这一点在第3章“图层几何”)。

Parallel Hierarchies(平行层级关系)
每一个UIView都有一个名为layer的属性,是CALayer的一个实例。这就是所谓的背衬层。视图是负责创建和管理这一层,并确保当子视图从他们相应的支持层在层树中添加或移除时相应的背衬层能够平衡的关联上试图层(见图1.2)。

图层树1.2结构(左)反映该视图层次结构(右)

它实际上是背景层,负责呈现你在屏幕上看到的一切的显示和动画。UIView就是一个包装了Core Animation 的基础功能的类,提供iOS特有的功能如触摸处理和高级界面。
为什么iOS的有根据的UIView和CALayer的这两条平行的层次结构?为什么不用单一层次来处理一切?究其原因是分离职责,从而避免重复代码。事件和用户界面在iOS上和Mac OS上的实现方式很不一样;基于多个手指同时触摸(多点触控)的用户界面与以鼠标键盘的操作方式是一个完全不同的模式。这就是为什么有iOS的UIKit中的UIView和和Mac OS拥有了AppKit和NSView的。它们在功能上是相似的,但在实现上相距甚远。

绘画,布局和动画,只适用于的像iPhone和iPad这样尽可能多的触摸屏设备,是相反的概念,因为他们作为的笔记本电脑和台式机的表兄弟。在逻辑上把这些Core Animation 库的功能单独分离开,苹果可以在iOS和MacOS间公用代码了。使得苹果自己得开发团队的OS开发团队和针对两个平台的第三方开发人员开发更加简单。

——————————————————————2014.3.16,1:11————————————

事实上,不是两个,而是四个这样的层次,分别执行不同的角色。除了视图层次结构和层树,还有演示树和渲染树, 
我们将在第7章分别讨论“隐式动画,”和第12章“性能调优速度“。


Layer Capabilities

所以,如果CALayer的是UIView的内部运作的只是一个实现细节,为什么我们需要了解它呢?当然,苹果提供的不错的,简单的UIView界面。正是如此,我们并不需要直接与核心动画本身的粗糙的细节处理?

这在一定程度上是真实的。为了简单起见,我们并不真正需要直接与应对CALayer,因为苹果已经很容易地利用强大的功能,如动画就间接通过使用简单的高级别API UIView的接口。

但由于牺牲了简洁性灵活性。如果你想要做的事稍微普通的,或使用功能的,苹果并没有选择在UIView类提供接口,你别无选择,只能冒险下到CoreAnimation探索较基础级别的选项。

我们既定了Layer不能处理像UIView的可触摸事件,所以什么Layer可以做但UIView不可以的?下面是CALayer的一些功能不包含 
UIView的: 
▪阴影,圆角和彩色边框 
▪3D转换和定位 
▪非矩形边界 
▪内容阿尔法掩蔽 
▪多步,非线性动画

——————————————————————2014.3.19,1:40————————————

我们在下面的章节探索这些功能,现在让我们来看看如何CALayer的可以在一个应用程序被使用。


Working with Layers

让我们开始创建一个简单的项目,该项目将使我们能够操纵的Layer属性。在Xcode中,创建一个使用单一视图应用程序模板创建一个新的iOS项目。

在屏幕的中间创建一个小的视图(约200×200像素)。你可以以编程方式或使用Interface Builder这样做(你喜欢就行)。只要确保你在你的视图控制器包含一个属性,使您可以直接访问小视图。我们叫它layerView。

如果您运行该项目,你应该看到一个白色方形在浅灰色的背景中间(见图1.3)。如果你没有看到这一点,你可能需要调整的背景窗口/视图的颜色。


图1.3白色的UIView在灰色背景中

这不是很令人兴奋的,所以让我们增添了少许色彩。我们将放置一个蓝色小方块在白色小方块的里面。 

我们可以通过简单地使用其他的UIView添加它作为一个子视图到我们已经创建了的UIView(无论是在代码或接口生成器)来实现这样的效果,但不会真的教给我们有关图层什么。

相反,让我们创建一个CALayer的,并把它作为一个子层,以我们的观点的支持层。虽然该层物业在UIView类接口公开,标准对于iOS应用程序的Xcode项目模板不包括核心动画标题,所以我们不能调用任何方法或访问层的任何属性,直到我们加入适当的 
框架到项目中。要做到这一点,首先添加QuartzCore框架中的应用 
目标的构建阶段选项卡(见图1.4),然后导入 
<QuartzCore/QuartzCore.h>在视图控制器的m文件。

——————————————————————2014.3.20,1:17————————————


0 0
原创粉丝点击