一.系统创建的CALayer
(1) CALayer的简单介绍
- 1.在
iOS
中,你能看的见摸得着的东西基本上都是UIView
,比如一个按钮,一个文本标签,一个文本输入框,一个图标等等,这些都是UIView
, - 2.
UIView
能够显示在屏幕上完全是因为它内部的一个图层 - 3.在创建
UIView
对象时,UIView
内部会自动创建一个图层(即CALayer
对象),通过UIView
的layer
属性可以访问这个层
@property(nonatomic,readonly,retain) CALayer *layer;
- 4.当
UIView
需要显示到屏幕上时,会调用drawRect
方法进行绘图,并且会将所有的内容绘制在自己的图层上,绘制完毕后,系统会将图层拷贝到屏幕上,于是进完成了UIView
的显示 - 5.换句话说,
UIView
本身不具备显示的功能,是它内部才有显示功能
(2).CALayer的基本使用
通过操作CALayer
对象,可以方便地调整UIView
的一些外观属性,比如:
- 1.阴影
Opacity
:不透明度(不透明度只要大于1就说明是有阴影的) - 2.圆角大小
- 3.边框宽度和颜色
........... - 还可以给图层添加动画,来实现一些比较炫酷的动画效果
简单的代码展示
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.title = @"早起的太阳"; self.navigationController.navigationBar.barTintColor = [UIColor brownColor]; self.navigationController.navigationBar.titleTextAttributes = @{NSFontAttributeName:[UIFont systemFontOfSize:25],NSForegroundColorAttributeName:[UIColor whiteColor]}; self.view.backgroundColor = [UIColor whiteColor]; UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; view.center = self.view.center; view.backgroundColor = [UIColor redColor]; [self.view addSubview:view]; /** * 使一张图片具有阴影的效果 */ //1.Opacity :不透明度(不透明度只要大于1就说明是有阴影的) view.layer.shadowOpacity = 1; //2.阴影的偏移 CGSizeMake(X[正的右偏移,负的左偏移], Y[正的下偏移,负的上偏移]); //view.layer.shadowOffset = CGSizeMake(10, -10); //3.设置阴影部分的面积颜色 view.layer.shadowColor = [UIColor yellowColor].CGColor; //4.阴影的圆角 view.layer.shadowRadius = 20; //5.view的圆角 view.layer.cornerRadius = 50; //6.view的边宽 view.layer.borderWidth = 1; //7.view的边颜色 view.layer.borderColor = [UIColor whiteColor].CGColor; }
(3)CALayer的图形旋转与缩放:都以layer
图层操作为例(下面以一个button
为例)
主要阐述两点:旋转和缩放两种方法
- <1>旋转(这两种方式一样)(建议不要使用KVC快速
缩放
或者旋转
)
1.旋转
//button.layer.transform = CATransform3DMakeRotation(M_PI, 1, 0.5, 1);
2.旋转
[button.layer setValue:@M_PI forKeyPath:@"transform.rotation"]; - <2>缩放(两种方式一样)
1.快速进行图层缩放
//button.layer.transform = CATransform3DMakeScale(0.5, 0.5, 1);
- 2.缩放
[button.layer setValue:@0.5 forKeyPath:@"transform.scale"];
上面的内容代码密码: 7u95
二.自己创建的CALayer层
1.创建图层
CALayer *layer = [CALayer layer]; layer.frame = CGRectMake(WIDTH/2-100, 200, 200, 200); layer.backgroundColor = [UIColor brownColor].CGColor;
2.图层只能添加到图层上面
[self.view.layer addSublayer:layer];
3.给图层添加图片
layer.contents = (id)([UIImage imageNamed:@"girl.jpg"].CGImage);
问题:为什么CALayer图层的颜色后面要加.CGColor
而图片加.CGImage
解释如下:
首先:
(1) CALayer 是定义在QuartzCore框架中的 (2) CGImageRef , CGColorRef 两种数据类型是定义在CoreGraphics中的 (3) UIColor , UIImage 是定义在UIKit 框架中
其次:
(1) QuartzCore框架和CoreGraphics 框架是可以跨平台使用的,在iOS和Mac OS X 上都能使用 (2) 但是UIKit 只能在iOS中使用
所以:为了保证可移植性,QuartzCore
不能使用UIImage
,UIColor
,只能使用CGImageRef
,CGColorRef
三.UIView与CALayer的选择
CALayer继承于NSObject
UIView继承于UIResponder(具有响应事件的能力)
- (1) 通过
CALayer
,就能做出跟UIImageView
一样的界面效果 - (2) 既然
CALayer
和UIView
都能实现相同的显示效果,那如何选择???
解释: 对比CALayer
,UIView
多了一个事件处理的功能,也就是说,CALayer
不能处理用户的触摸事件,而UIView
可以,所以:如果显示出来的东西需要跟用户进行交互的话,用UIView
:如果不需要跟用户进行交互的话,就用UIVIew
或者CALayer
都可以,当然,CALayer
的性能会高一些,因为它多了处理事件的功能,更加轻量级.
**四.介绍一下CALayer的两个重要属性position 和 anchorPoint **
- @property CGPoint position; 用来设置
CALayer
在父层中的位置,以父层的左上角为原点(0,0):类似frame - @property CGPoint anchorPoint; 称为"定位点","锚点",决定着CALayer 身上的哪个点会在position 属性所指的位置,以自己的左上角为原点(0,0),它的x,y取值范围都是0~1,默认值为(0.5,0.5):类似bounds
只有图层才有anchorPoint这个属性
具体的显示(锚点默认在中心=center
) 在旋转时:锚点也就是旋转的点