Core Animation
其实是一个令人误解的命名。你可能认为它只是用来做动画的, 但实际上它是从一个叫做Layer Kit
这么一个不怎么和动画有关的名字演变而来,所 以做动画这只是Core Animation
特性的冰山一角。
Core Animation
是一个复合引擎,它的职责就是尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的图层,存储在一个叫做图层树的体系之中。于是这个树形成了UIKit
以及在iOS
应用程序当中你所能在屏幕上看见的一切的基础。
在我们讨论动画之前,我们将从图层树开始,涉及一下Core Animation
的静态组 合以及布局特性。
1.1 图层与视图
一个视图就是在屏幕上显示的一个矩形块(比如图片,文字或者视频),它 能够拦截类似于鼠标点击或者触摸手势等用户输入。视图在层级关系中可以互相嵌 套,一个视图可以管理它的所有子视图的位置。
在iOS
当中,所有的视图都从一个叫做UIVIew
的基类派生而来, UIView
可以 处理触摸事件,可以支持基于Core Graphics
绘图,可以做仿射变换(例如旋转或 者缩放),或者简单的类似于滑动或者渐变的动画。
CALayer
CALayer
类在概念上和UIView
类似,同样也是一些被层级关系树管理的矩形块,同样也可以包含一些内容(像图片,文本或者背景色),管理子图层的位置。 它们有一些方法和属性用来做动画和变换。和 UIView
最大的不同是 CALayer
不 处理用户的交互。
平行的层级关系
每一个 UIview
都有一个 CALayer
实例的图层属性,也就是所谓的backing layer
,视图的职责就是创建并管理这个图层,以确保当子视图在层级关系中添加或 者被移除的时候,他们关联的图层也同样对应在层级关系树当中有相同的操作
实际上这些背后关联的图层才是真正用来在屏幕上显示和做动画, UIView
仅仅 是对它的一个封装,提供了一些iOS
类似于处理触摸的具体功能,以及Core Animation
底层方法的高级接口。
图层的能力
如果说 CALayer
是 UIView
内部实现细节,那我们为什么要全面地了解它呢? 苹果当然为我们提供了优美简洁的 UIView
接口,那么我们是否就没必要直接去处理Core Animation
的细节了呢?
某种意义上说的确是这样,对一些简单的需求来说,我们确实没必要处理 CALayer
,因为苹果已经通过 UIView
的高级API
间接地使得动画变得很简单。
但是这种简单会不可避免地带来一些灵活上的缺陷。如果你略微想在底层做一些改变,或者使用一些苹果没有在UIView
上实现的接口功能,这时除了介入Core Animation
底层之外别无选择。
我们已经证实了图层不能像视图那样处理触摸事件,那么他能做哪些视图不能做 的呢?这里有一些 UIView
没有暴露出来的CALayer
的功能:
- 阴影,圆角,带颜色的边框 3D变换
- 非矩形范围
- 透明遮罩
- 多级非线性动画
我们将会在后续章节中探索这些功能,首先我们要关注一下在应用程序当中CALayer
是怎样被利用起来的。
使用图层
之后就可以在代码中直接引用 的属性和方法。我们用创 建了一个,设置了它的 属性,然后添加到了背后相关图层的子图层(这段代码的前提是通过IB创建 并做好了连接)
- (void)viewDidLoad
{
[super viewDidLoad];
//create sublayer
CALayer *blueLayer = [CALayer layer];
blueLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
blueLayer.backgroundColor = [UIColor blueColor].CGColor;
//add it to our view
[self.layerView.layer addSublayer:blueLayer];
}
一个视图只有一个相关联的图层(自动创建),同时它也可以支持添加无数多个子图层,你可以显示创建一个单独的图层,并且把它直接添加到视图关联图层的子图层。尽管可以这样添加图层,但往往我们只是简单地处理视图,他们关联的图层并不需要额外地手动添加子图层。
使用图层关联的视图而不是CALayer
的好处在于,你能在使用所有CALayer
底层特性的同时,也可以使用UIView
的高级API
(比如自动排版,布局和事件处理)。
然而,当满足以下条件的时候,你可能更需要使用 CALayer
而不是 UIView
:
- 开发同时可以在Mac OS上运行的跨平台应用
- 使用多种的子类,并且不想创建额外的
UIView
去包封装它们所有 - 做一些对性能特别挑剔的工作,比如对
UIView
一些可忽略不计的操作都会引起显著的不同(尽管如此,你可能会直接想使用OpenGL
绘图)
但是这些例子都很少见,总的来说,处理视图会比单独处理图层更加方便。
总结
这一章阐述了图层的树状结构,说明了如何在iOS
中由 UIView
的层级关系形成 的一种平行的 CALayer
层级关系,在后面的实验中,我们创建了自己的 ,并把它添加到图层树中。
网友评论