//先给出弧度web
lblMsg.layer.cornerRadius = 6;框架
//在截取角性能
lblMsg.layer.masksToBounds = YES;动画
1、什么是CALayerspa
在iOS系统中,你能看得见摸得着的东西基本上都是UIView,好比一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView。.net
其实UIView之因此能显示在屏幕上,彻底是由于它内部的一个层。code
在建立UIView对象时,UIView内部会自动建立一个层(即CALayer对象),经过UIView的layer属性能够访问这个层。当UIView须要显示到屏幕上时,会调用drawRect:方法进行绘图,而且会将全部内容绘制在本身的层上,绘图完毕后,系统会将层拷贝到屏幕上,因而就完成了UIView的显示。orm
换句话说,UIView自己不具有显示的功能,是它内部的层才有显示功能。对象
2、CALayer的简单使用事件
上面已经说过了,UIView之因此可以显示,彻底是由于内部的CALayer对象。所以,经过操做这个CALayer对象,能够很方便地调整UIView的一些界面属性,好比:阴影、圆角大小、边框宽度和颜色等。
1.CALayer是被定义在QuartzCore框架中的,所以要想使用CALayer,先导入QuartzCore框架
在项目描述页面添加框架便可!
2.在项目代码中导入QuartzCore框架的主头文件
// #import
3.经过CALayer修改UIImageView的界面属性
你也可使用UIButton或者UILabel,这里就以UIImageView为例子
<!-- lang: cpp -->1> 先建立一个UIImageView,添加到控制器的view中
1 UIImage image = [UIImage imageNamed:@“lufy.png”];
2 UIImageView imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
3 imageView.center = CGPointMake(100, 100);
4 [self.view addSubview:imageView];
2> 设置阴影
1 imageView.layer.shadowColor = [UIColor grayColor].CGColor;
2 imageView.layer.shadowOffset = CGSizeMake(10, 10);
3 imageView.layer.shadowOpacity = 0.5;
第1行设置阴影的颜色为灰色,注意,这里使用的是UIColor的CGColor属性,是一种CGColorRef类型的数据
第2行设置阴影的偏移大小,能够看出阴影往原图的右下角偏移
第3行设置阴影的不透明度为0.5,表示半透明。若是为1,表明彻底不透明。
3> 设置圆角大小
经过layer属性能够访问视图内部的CALayer对象
1 imageView.layer.cornerRadius = 10;
2 imageView.layer.masksToBounds = YES;
第1行设置圆角半径为10
第2行的maskToBounds=YES:能够看作是强制内部的全部子层支持圆角效果,少了这个设置,UIImageView是不会有圆角效果的
4> 设置边框宽度和颜色
1 imageView.layer.borderWidth = 5;
2 imageView.layer.borderColor = [UIColor redColor].CGColor;
5> 设置旋转
imageView.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);
利用transform属性能够设置旋转、缩放等效果
M_PI_4表示四分之π,顺时针旋转45°
后面的(0, 0, 1)表示Z轴这个向量,修改这个向量能够作一些三维旋转效果,你能够随便改个值试一下,好比(1, 1, 1)
上面已经说过,UIView内部默认有个CALayer对象(层),经过layer属性能够访问这个层。要注意的是,这个默认的层不容许从新建立,但能够往层里面添加子层
UIView能够经过addSubview:方法添加子视图,相似地,CALayer能够经过addSublayer:方法添加子层
接下来演示一下如何添加子层:
3、添加一个简单的图层
<!-- lang: cpp -->CALayer *myLayer = [CALayer layer];
// 设置层的宽度和高度(100x100)
myLayer.bounds = CGRectMake(0, 0, 100, 100);
// 设置层的位置
myLayer.position = CGPointMake(100, 100);
// 设置层的背景颜色:红色
myLayer.backgroundColor = [UIColor redColor].CGColor;
// 设置层的圆角半径为10
myLayer.cornerRadius = 10;
// 添加myLayer到控制器的view的layer中
[self.view.layer addSublayer:myLayer];
4、添加一个显示图片的图层
<!-- lang: cpp -->CALayer *myLayer = [CALayer layer];
// 设置层的宽度和高度(100x100)
myLayer.bounds = CGRectMake(0, 0, 100, 100);
// 设置层的位置
myLayer.position = CGPointMake(100, 100);
// 设置须要显示的图片
myLayer.contents = (id)[UIImage imageNamed:@“lufy.png”].CGImage;
// 设置层的圆角半径为10
myLayer.cornerRadius = 10;
// 若是设置了图片,须要设置这个属性为YES才有圆角效果
myLayer.masksToBounds = YES;
// 添加myLayer到控制器的view的layer中
[self.view.layer addSublayer:myLayer];
在第7行设置须要显示的图片,注意,这里用的是UIImage的CGImage属性,是一种CGImageRef类型的数据
5、为何CALayer中使用CGColorRef和CGImageRef这2种数据类型,而不用UIColor和UIImage?
首先要知道:CALayer是定义在QuartzCore框架中的;CGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的;UIColor、UIImage是定义在UIKit框架中的
其次,QuartzCore框架和CoreGraphics框架是能够跨平台使用的,在iOS和Mac OS X上都能使用,可是UIKit只能在iOS中使用
所以,为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef
不过不少状况下,能够经过UIKit对象的特定方法,获得CoreGraphics对象,好比UIImage的CGImage方法能够返回一个CGImageRef
6、UIView和CALayer的选择
细心的朋友不难发现,其实前面的2个效果不只能够经过添加层来实现,还能够经过添加UIView来实现。好比,第1个红色的层能够用一个UIView来实现,第2个显示图片的层能够用一个UIImageView来实现。 既然CALayer和UIView都能实现相同的显示效果,那究竟该选择谁好呢?
其实,对比CALayer,UIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView能够
因此,若是显示出来的东西须要跟用户进行交互的话,用UIView;若是不须要跟用户进行交互,用UIView或者CALayer均可以
固然,CALayer的性能会高一些,由于它少了事件处理的功能,更加轻量级
7、UIView和CALayer的其余关系
UIView能够经过subviews属性访问全部的子视图,相似地,CALayer也能够经过sublayers属性访问全部的子层
UIView能够经过superview属性访问父视图,相似地,CALayer也能够经过superlayer属性访问父层
若是两个UIView是父子关系,那么它们内部的CALayer也是父子关系。
8、隐式动画属性
每个UIView内部都默认关联着一个CALayer,咱们可用称这个Layer为Root Layer(根层)。全部的非Root Layer,也就是手动建立的CALayer对象,都存在着隐式动画。
当对非Root Layer的部分属性进行相应的修改时,默认会自动产生一些动画效果,这些属性称为Animatable Properties(可动画属性)。
列举几个常见的Animatable Properties:
bounds:用于设置CALayer的宽度和高度。修改这个属性会产生缩放动画
backgroundColor:用于设置CALayer的背景色。修改这个属性会产生背景色的渐变更画
position:用于设置CALayer的位置。修改这个属性会产平生移动画
好比:假设一开始CALayer的position为(100, 100),而后在某个时刻修改成(200, 200),那么整个CALayer就会在短期内从(100, 100)这个位置平移到(200, 200)
咱们也能够从官方文档中查询全部的Animatable Properties
9、position和anchorPoint
position和anchorPoint属性都是CGPoint类型的
position能够用来设置CALayer在父层中的位置,它是以父层的左上角为坐标原点(0, 0)
anchorPoint称为"定位点”,它决定着CALayer身上的哪一个点会在position属性所指的位置。它的x、y取值范围都是0~1,默认值为(0.5, 0.5)
1.建立一个CALayer,添加到控制器的view的layer中
CALayer *myLayer = [CALayer layer];
// 设置层的宽度和高度(100x100)
myLayer.bounds = CGRectMake(0, 0, 100, 100);
// 设置层的位置
myLayer.position = CGPointMake(100, 100);
// 设置层的背景颜色:红色
myLayer.backgroundColor = [UIColor redColor].CGColor;
// 添加myLayer到控制器的view的layer中
[self.view.layer addSublayer:myLayer];
第5行设置了myLayer的position为(100, 100),又由于anchorPoint默认是(0.5, 0.5),因此最后的效果是:myLayer的中点会在父层的(100, 100)位置
2.若将anchorPoint改成(0, 0),myLayer的左上角会在(100, 100)位置
1 myLayer.anchorPoint = CGPointMake(0, 0);
3.若将anchorPoint改成(1, 1),myLayer的右下角会在(100, 100)位置
1 myLayer.anchorPoint = CGPointMake(1, 1);
4.将anchorPoint改成(0, 1),myLayer的左下角会在(100, 100)位置
1 myLayer.anchorPoint = CGPointMake(0, 1);
我想,你应该已经明白anchorPoint的用途了吧,它决定着CALayer身上的哪一个点会在position所指定的位置上。它的x、y取值范围都是0~1,默认值为(0.5, 0.5),所以,默认状况下,CALayer的中点会在position所指定的位置上。当anchorPoint为其余值时,以此类推。