核心动画这个名字本身具有误导性。看到这个名字,大家很可能会认为这个框架(framework)的首要功能是动画,但事实上,动画只是这个框架的一个小的方面。这个框架之前的名字叫做Layer Kit。
核心动画是一个合成引擎,它的工作是尽可能快的将不同的可视化的内容合成到屏幕上。这个可视化内容是不同的层(layer),构成一个叫做层树(layer tree)的层次结构。
这个树结构是UIKit的基础材料。
在讨论动画之前,我们先要讨论核心动画的静态合成(static composing)和与布局相关的特性,让我们从层树开始入手吧。
层(layer)和视图(view)
CALayer
并行的层次结构
层的功能
使用CALayer
让我们新建一个工程,熟悉一下CALayer的相关属性。在Xcode中,通过Single View Application模板新建一个iOS工程。在屏幕的中间创建一个小一点的View(大约200*200点),你可以通过代码创建,也可以在Interface Builder中创建,确保在view controller中有一个指向这个小view得属性,方便我们迅速找到它。我给他起个名字,叫做layerView。
运行这个工程,你会看到一个白色正方形出现在灰色的屏幕当中(图1.3)。如果你看到的不是这样的话,改变window或者父view的背景色。
图1.3 灰色背景上的白色UIView
这没什么令人激动的地方,让我们来添加点明快的色彩。我们在白色的方块中再添加一个蓝色的小方块。
要实现这样的效果,我们完全可以再新建一个更小的UIView,然后添加作为白色view的子view,但是这样做就不会接触的layer了。相反的,我们这里创建一个CALayer的对象,并将其添加到白色view的支撑层当中,作为支撑层的子层。首选,我们需要把所需要的框架添加到工程当中,这里我们需要添加QuartzCore Framework (图1.4),然后在view controller的.m文件中import <QuartzCore/QuartzCore.h> 。
图1.4 在工程中添加QuartzCore Framework
导入之后,我们就可以在代码中使用CALayer和它所包含的属性与方法了。在代码1.1中,我们创建了一个CALayer对象,然后将其背景颜色设置为蓝色,再然后,把它添加到layerView的支撑层中,作为子layer(图1.5)。
CALayer的backgroundColor的数据类型是CGColorRef,并不像UIView的backgroundColor属性的数据类型那样是UIColor。如果你愿意的话,你可以用core graphics中的方法来创建一个CGColorRef,但是我们也可以用UIColor的一个叫做CGColor的属性来获得CGColorRef,这样做你就不必手动释放颜色了。
代码1.1 给view添加蓝色子layer
#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UIView *layerView;
@end
@implementation ViewController
- (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]; }
@end
图1.5 白色的view中添加了一个蓝色的layer
一个view只能有一个支撑层(由view自动创建),但是却可以任意给支撑层添加子层,就像我们在代码1.1中做的那样。大多数情况我们都无需创建子层,仅仅操作view和它的支撑层就能满足很大一部分工作。
这样做的好处是你不仅可以充分利用CALayer提供给我们的特性,同时还可以利用UIView提供的高级的接口方法(比如自动调整大小,自动布局,事件处理)。
但是,下列情况中,你将不得不使用CALayer而不是UIView:
你的代码同时也要运行在Mac OS上
你将用到一些CALayer的子类(第六章详细介绍)
你的代码对性能要求很高,UIView所带来的额外开销是不可忍受的(如果是这样的话,你可能会考虑使用OpenGL)
以上这些情况并不是很常见。使用UIView会比使用CAlayer更方便。
726

被折叠的 条评论
为什么被折叠?



