CALayer 和 UIView 联系
CALayer的相关属性
CALayer之隐式动画
一. CALayer 和 UIView 联系
-
在iOS中,能看得见的基本上都是UIView(比如按钮、图片、文本等),而 UIView之所以能显示在屏幕上,是因为它拥有CALayer对象。
-
在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层
-
当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示。换句话说,UIView本身不具备显示的功能,是它内部的层才有显示功能
-
CALayer不能处理用户的触摸事件。所以,如果显示的东西需要交互就选择UIView,不需要的话用 UIView或者CALayer都可以,后者性能会高一些,它少了事件处理的功能,更加轻量级。
二. CALayer的相关属性
宽、高
@property CGRect bounds;
背景颜色(CGColorRef类型)
@property CGColorRef backgroundColor;
边框颜色(CGColorRef类型)
@property CGColorRef borderColor;
边框宽度
@property CGFloat borderWidth;
圆角半径
@property CGColorRef borderColor;
内容(比如设置为图片CGImageRef)
@property(retain) id contents;
位置(默认指中点(0.5,0.5),随anchorPoint变化)
@property CGPoint position;
锚点(x,y的范围都是0-1),决定了position的含义
@property CGPoint anchorPoint;
形变属性
@property CATransform3D transform;
旋转
CATransform3DMakeRotation(M_PI, 1, 0, 0);
平移
CATransform3DMakeTranslation(x,y,z)
缩放
CATransform3DMakeScale(x,y,z);
可以通过KVC的方式进行设置属性.
但是需要将CATransform3DMakeRotation(结构体)转成对象.
🍐:
NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 0, 0)];
[_imageView.layer setValue:value forKeyPath:@"transform.scale"];
三. CALayer之隐式动画
-
UIView内部默认关联着一个CALayer,可称为Root Layer(根层),而所有非Root Layer(手动创建的CALayer),都存在着隐式动画
-
隐式动画:
非Root Layer的部分属性修改时,系统默认会自动产生动画效果,这样的属性(二中的属性)称为Animatable Properties(可动画属性) -
隐式动画关闭(默认是开启)
可以通过动画事务(CATransaction)关闭默认的隐式动画效果
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.view.layer.position = CGPointMake(15, 15);
[CATransaction commit];
备注
CALayer是在QuartzCore框架中定义的
CGImageRef、CGColorRef两种数据类型在CoreGraphics中定义的
UIColor、UIImage是在UIKit中定义的
其次
QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用
但是UIKit只能在iOS中使用
为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef
网友评论