Core Animation 第一章 图层树

序章

图层(Layer)与视图(View)

视图

视图是大家比较熟悉,也是经常接触到的,书中的原意为:

一个视图就是屏幕上显示的一个矩形块,它能够拦截鼠标点击或者触摸手势等用户输入。视图在层级关系中可以相互嵌套。

iOS开发中的视图为UIView及其子类,UIView可以处理触摸时间,支持Core Graphics绘图,进行仿射变换(CGAffineTransform)等。

图层

CALayer的功能与UIView基本类似,只不过CALayer不处理用户的交互,需要注意的是CALayer只是不处理,即不关心响应链,但CALayer依旧提供了判断触点位置的方法。

层级关系

每一个UIView都有一个CALayer的实例(backing layer),这个实例由UIView创建和管理。这个layer才是真正用来在屏幕上显示和做动画的,而UIView则是对CALayer进行了封装,提供了处理触摸的功能,已经CoreAnimation底层方法的高级接口。

图层的能力

上面说过UIView封装了许多CoreAnimation中的底层方法,但CALayer依然有很多功能是UIView中没有涉及到的:

  • 阴影,圆角,边框
  • 3D变换
  • 非矩形范围
  • 多级非线性动画

具体的内容会在后面一一讲述。

使用图层

我们来创建一个工程,在屏幕中央添加一个UIView(200 x 200)作为我们接下来要使用的View,命名为layerView。

Core Animation 第一章 图层树_第1张图片
普通的白色视图.png

然后我们在这个白色的view上面添加一个小的蓝色图层。书中提到这里需要导入QuartzCore.framework,不过现在大家已经不需要再单独添加了[笑]。

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *layerView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    CALayer *blueLayer = [CALayer layer];
    blueLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f);
    blueLayer.backgroundColor = [UIColor blueColor].CGColor;
    //添加子图层
    [self.layerView.layer addSublayer:blueLayer];
}
@end

效果如下:

Core Animation 第一章 图层树_第2张图片
白色视图内嵌蓝色图层.png

使用图层关联的视图而不是CALayer的好处在于,你能在使用所有CALayer底层特性的同时,也可以使用UIView的高级API。然而,当满足一下条件时,你可能更需要使用CALayer:

  • 开发同时可以再macOS上运行的跨平台应用
  • 使用多种CALayer的子类
  • 性能调优
    不过总的来说,处理视图比单独处理图层更加方便。

你可能感兴趣的:(Core Animation 第一章 图层树)