1、关于Core Animation
- Core Animation是一个复合引擎,它的职责就是尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的图层,存储在一个叫做 "图层树"的体系之中
- 于是这个 "图层树" 形成了UIKit以及在iOS应用程序当中你所能在屏幕上看见的一切的基础
2、图层与视图
视图
- 1、一个视图就是在屏幕上显示的一个矩形块(比如:图片、文字、视频),它能够拦截类似于鼠标点击或者触摸手势登用户输入
- 2、视图在层级关系中可以相互嵌套,一个视图可以管理它的所有 "子视图"的位置
- 3、在iOS当中,所有的视图都从一个叫做 UIView 的基类派生而来,UIView可以处理触摸时间,可以支持基于Core Graphics绘图,可以做仿射变换(比如:旋转或者缩放)
图层CALayer
- 1、CALayer 类在概念上和UIView类似,同样也是一些被层级关系树管理的矩形块,同样也可以包含一些内容(比如:图片、文本)管理子图层的位置,它们有一些方法和属性用来做动画和变换
- 2、和UIView最大的不同是CALayer不处理用户交互
3、图层和视图的平行的层级关系
1、每一个UIView都有一个CALayer实例的图层属性,也就是所谓的backing layer,"视图"的职责就是创建并管理这个"图层",以确保当子视图在层级关系中添加或者移除时候,他们关联的图层也同样对应在层级关系树当中有相同的操作
2、实际上这些背后关联的"图层"才是真正用来在屏幕上显示和做动画,UIView仅仅是对它的一个封装,提供了一些iOS类似于处理触摸的具体功能,以及Core Animation底层方法的高级接口
3、为什么iOS要基于 UIView 和 CALayer 提供两个平行的层级关系呢?为什么不用一个简单的层级来处理所有事情呢?:为了就是要做到职责分离,这样也能避免很多重复代码
4、实际上,这里并不是两个层级关系,而是四个,每一个都扮演不同的角色
视图层级
图层树
呈现树
渲染树
4、通过一个实例:给一个视图中的图层添加一个“子图层”
#import "ViewController.h"
//#import <QuartzCore/QuartzCore.h>
@interface ViewController ()
/**
* layerView
*/
@property (nonatomic, strong) UIView *layerView;
/**
* blueLayer
*/
@property (nonatomic, strong) CALayer *blueLayer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 背景颜色
self.view.backgroundColor = [UIColor darkGrayColor];
// View
self.layerView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
self.layerView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.layerView];
//blueLayer
self.blueLayer = [CALayer layer];
self.blueLayer.frame = CGRectMake(50, 50, 100, 100);
self.blueLayer.backgroundColor = [UIColor blueColor].CGColor;
[self.layerView.layer addSublayer:self.blueLayer];
}
@end
小结
- 一个视图只有一个相关的图层(自动创建),同时它也可以支持添加无数多个子图层