UIView
iOS中所有的视图均是从UIVIew派生的,UIVIew可以处理触摸事件、支持Core Graphics绘图、可以做仿射变换(例如旋转、缩放)、也可以做一些滑动或渐变的动画
CALayer
CALayer类似UIVIew,也还一些被层级关系树管理的块,CALayer(图层)可以包含图片、文字等内容,可以管理自己的子图层,也有一些方法和属性用来做动画和变换。
但是和UIView不同的是,CALayer不能响应事件,它不清楚响应链,即使它有一些判断点是否在自己的范围内,
UIView和CALayer
UIView的层级关系对应着一个平行的CALayer层级关系,每一个UIView有关联这一个CALayer的实例,视图的职责就是创建和管理这个图层(当子视图添加或删除的时候,他们关联的图层在对应的层级关系树中也会有相应的操作)以及处理触摸事件等,CALayer才是真正的用来做屏幕上的显示和动画,UIView仅是对它的封装,提供一些接口然我们可以简单的设置该视图对应的图层
之所以不用一个层级处理所有的事是为了职责分离
图层可以做的功能
(1)阴影、圆角、带颜色的边框
(2)3D变换
(3)非矩形的范围
(4)透明遮罩
(5)非线性的动画
使用CALayer的例子
下面的例子可一说明两点
(1)说明视图View的原点在左上角,而CALayer图层的原点在view的左上角,个人认为原因是将blueLayer添加到view中
(2)一个视图只有一个关联的图层(自动创建的),但是可以给它添加无数个图层,其实添加的图层是添加到关联的图层的图层树中
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(self.view.frame.size.width/2-100, self.view.frame.size.height/2-100, 200, 200)];
view.backgroundColor = [UIColor whiteColor];
[self.view addSubview:view];
//view中添加红色view
UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(self.view.frame.size.width/2-50, self.view.frame.size.height/2-50, 100, 100)];
view1.backgroundColor = [UIColor redColor];
[self.view addSubview:view1];
//view中添加蓝色Layer
CALayer *blueLayer = [CALayer layer];
//CGRectMake(0, 0, 100, 100)对应第一个图,
// blueLayer.frame = CGRectMake(0, 0, 100, 100);
//对应第二个图
blueLayer.frame = CGRectMake(0, 20, 100, 100);
blueLayer.backgroundColor = [UIColor blueColor].CGColor;
[view.layer addSublayer:blueLayer];