[iOS Animation]-CALayer 图层树 二

图层的能力

若是说CALayer是UIView内部实现细节,那咱们为何要全面地了解它呢?苹果固然为咱们提供了优美简洁的UIView接口,那么咱们是否就不必直接去处理Core Animation的细节了呢? git

某种意义上说的确是这样,对一些简单的需求来讲,咱们确实不必处理CALayer,由于苹果已经经过UIView的高级API间接地使得动画变得很简单。 github

可是这种简单会不可避免地带来一些灵活上的缺陷。若是你略微想在底层作一些改变,或者使用一些苹果没有在UIView上实现的接口功能,这时除了介入Core Animation底层以外别无选择。 框架

咱们已经证明了图层不能像视图那样处理触摸事件,那么他能作哪些视图不能作的呢?这里有一些UIView没有暴露出来的CALayer的功能: 布局

  • 阴影,圆角,带颜色的边框
  • 3D变换
  • 非矩形范围
  • 透明遮罩
  • 多级非线性动画

咱们将会在后续章节中探索这些功能,首先咱们要关注一下在应用程序当中CALayer是怎样被利用起来的。 性能

使用图层

首先咱们来建立一个简单的项目,来操纵一些layer的属性。打开Xcode,使用Single View Application模板建立一个工程。 动画

在屏幕中央建立一个小视图(大约200 X 200的尺寸),固然你能够手工编码,或者使用Interface Builder(随你方便)。确保你的视图控制器要添加一个视图的属性以即可以直接访问它。咱们把它称做layerView。 ui

运行项目,应该能在浅灰色屏幕背景中看见一个白色方块(图1.3),若是没看见,可能须要调整一下背景window或者view的颜色 编码

图1.3

图1.3 灰色背景上的一个白色UIView atom

这并无什么使人激动的地方,咱们来添加一个色块,在白色方块中间添加一个小的蓝色块。 spa

咱们固然能够简单地在已经存在的UIView上添加一个子视图(随意用代码或者IB),但这不能真正学到任何关于图层的东西。

因而咱们来建立一个CALayer,而且把它做为咱们视图相关图层的子图层。尽管UIView类的接口中暴露了图层属性,可是标准的Xcode项目模板并无包含Core Animation相关头文件。因此若是咱们不给项目添加合适的库,是不可以使用任何图层相关的方法或者访问它的属性。因此首先须要添加QuartzCore框架到Build Phases标签(图1.4),而后在vc的.m文件中引入库。

图1.4

图1.4 把QuartzCore库添加到项目

以后就能够在代码中直接引用CALayer的属性和方法。在清单1.1中,咱们用建立了一个CALayer,设置了它的backgroundColor属性,而后添加到layerView背后相关图层的子图层(这段代码的前提是经过IB建立了layerView并作好了链接),图1.5显示告终果。

清单1.1 给视图添加一个蓝色子图层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
@interface ViewController ()
 
@property (nonatomic, weak) IBOutlet UIView *layerView;
 
@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];
}

图1.5

图1.5 白色UIView内部嵌套的蓝色CALayer

一个视图只有一个相关联的图层(自动建立),同时它也能够支持添加无数多个子图层,从清单1.1能够看出,你能够显示建立一个单独的图层,而且把它直接添加到视图关联图层的子图层。尽管能够这样添加图层,但每每咱们只是见简单地处理视图,他们关联的图层并不须要额外地手动添加子图层。

在Mac OS平台,10.8版本以前,一个显著的性能缺陷就是因为用了视图层级而不是单独在一个视图内使用CALayer树状层级。可是在iOS平台,使用轻量级的UIView类并无显著的性能影响(固然在Mac OS 10.8以后,NSView的性能一样也获得很大程度的提升)。

使用图层关联的视图而不是CALayer的好处在于,你能在使用全部CALayer底层特性的同时,也可使用UIView的高级API(好比自动排版,布局和事件处理)。

然而,当知足如下条件的时候,你可能更须要使用CALayer而不是UIView

  • 开发同时能够在Mac OS上运行的跨平台应用
  • 使用多种CALayer的子类(见第六章,“特殊的图层“),而且不想建立额外的UIView去包封装它们全部
  • 作一些对性能特别挑剔的工做,好比对UIView一些可忽略不计的操做都会引发显著的不一样(尽管如此,你可能会直接想使用OpenGL绘图)

可是这些例子都不多见,总的来讲,处理视图会比单独处理图层更加方便。

总结

这一章阐述了图层的树状结构,说明了如何在iOS中由UIView的层级关系造成的一种平行的CALayer层级关系,在后面的实验中,咱们建立了本身的CALayer,并把它添加到图层树中。

相关文章
相关标签/搜索