CALayer的基本属性
CALayer和UIView的关系
position和anchorPoint的作用
1.CALayer的基本属性
- UIView之所以能显示在屏幕上,完全是因为它内部的一个图层(CALayer对象),UIView对象创建时,内部会自动创建一个图层与之相关联,通过UIView的layer属性可以访问这个层
@property(nonatomic,readonly,retain)CALayer*layer;
- 当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘制,把所有的内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,由此完成UIView的显示。
- UIView本身不具备显示的功能,是它内部的图层才有显示功能。
- CALayer的基本使用:通过操作CALayer对象,可以很方便的调整UIView的一些外观属性,比如:
-
- 阴影、圆角大小、边框宽度和颜色等……
- 还可以给图层添加动画,实现一些酷炫效果
CALayer的属性:
宽度和高度:@propertyCGRect bounds;
位置(默认指中点,具体由anchorPoint决定):@propertyCGPoint position;
锚点(x,y的范围都是0-1),决定了position的含义:@propertyCGPoint anchorPoint;
背景颜色(CGColorRef类型)@propertyCGColorRef backgroundColor;
形变属性:@propertyCATransform3D transform;
边框宽度:@propertyCGFloat borderWidth;
边框颜色:@propertyCGColorRef borderColor;
内容(比如设置为图片CGImageRef):@property(retain) id contents;
CALayer的疑点:
- CALayer是定义在QuartzCore框架中的,CGImageRef和CGColorRef两种数据类型是定义在CoreGraphics框架中的,而UICOlor和UIImage是定义在UIKit框架中的
- QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用,而UIKit只能在iOS中使用,所以为了保证移植性,QuartzCore不能使用UIImage和UIColor,只能使CGImageRef和CGColorRef
2.CALayer和UIView之间的联系
通过CALayer就能做出和UIImageView一样的界面效果;
CALayer和UIView都能实现相同的显示效果,那么究竟该选哪一个?比较如下:
a. UIView比CALayer多了一个事件处理的功能,CALayer不能处理用户的触摸事件,而UIView可以
b. 如果显示的东西需要和用户交互,用UIView;如果不需要和用户交互,用UIView和CALayer都可以
c. CALayer的性能会高一些,少了事件处理功能,更加轻量级
3.position和anchorPoint的作用
CALayer有2个非常重要的属性:
- position: @property CGPoint position;用来设置CALayer在父层上的位置,以父层的左上角为原点(0,0)
- anchorPoint: @property CGPoint anchorPoint;称为“定位点”、“锚点”,决定CALayer身上的哪个点会在 position属性所指的位置,以自己的左上角为原点(0,0),x,y取值范围都是0~1,默认值是(0.5,0.5)
隐式动画:每个UIView内部都默认关联着一个CALayer,称这个Layer为Root Layer(根层),所有的非Root Layer也就是手动创建的CALayer对象,都存在着隐式动画
隐式动画:对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果,这些属性称为Animatable Properties(可动画属性)
几个常见的Animatable Properties:
bounds:用于设置CALayer的宽度和高度,修改这个属性会产生缩放动画
backgroundColor:用于设置CALayer的背景颜色,修改这个属性会产生背景色的渐变动画
posotion:用于设置CALayer的位置,修改这个属性会产生平移动画
可以通过动画事务(CATransaction)关闭默认的隐式动画效果;
注意:UIImageView当中Image并不是直接添加在层上面的.这是添加在layer当中的contents里.我们设置层的所有
属性,它只作用在层上面.对contents里面的东西并不起作用.所以我们看不到图片有圆角的效果.想要让图片有圆角的效果.
可以把masksToBounds这个属性设为YES,当设为YES,把就会把超过根层以外的东西都给裁剪掉。
利用KVC对CALayer属性的操作:当需要做一些快速缩放,平移,二维的旋转时用KVC.比如: [_imageView.layer setValue:@0.5 forKeyPath:@"transform.scale"];快速的进行缩放.后面forKeyPath属性值不是乱写的.苹果文档中给了相关的属性.