CALayer总结
每个uiview都有一个层,每个层可以有多个子层。
1)layer的设计目的不是取代视图,不能基于layer创建一个可视化的控件
2)layer设计目的是提供视图的基本可视内容。提高动画的执行效率。主要是提高动画的执行效率。
3)除了提供可视内容。layer不负责事件响应,内容填充,layer不参与到响应者链条中。
改变视图的layer的属性,会包含一些隐式动画。
常用的属性有,圆角半径,阴影,边框
它是动画的核心。
核心动画的本质是,将CALayer中的内容转换成位图,然后由图形硬件来操作。
每个uiview内部都有个layer.layer的视图功能非常强大。
CALayer并不是属于uikit框架,在QuartzCore.FrameWork框架了。需要引用这个框架。
使用uiview的layer属性
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
UIView *myview = [[UIView alloc] initWithFrame:CGRectMake(60, 130, 200, 200)];
[myview setBackgroundColor:[UIColor redColor]];
[self.view addSubview:myview];
// 设置圆角半径
myview.layer.cornerRadius = 15.0f;
// 设置阴影 因为核心动画是夸平台的,不能用UI的方法,因为UIKit框架只能用于ios
[myview.layer setShadowColor:[UIColor blueColor].CGColor];
[myview.layer setShadowOffset:CGSizeMake(5, 5)];
[myview.layer setShadowOpacity:0.5f];
// 设置边框
[myview.layer setBorderColor:[UIColor greenColor].CGColor];
[myview.layer setBorderWidth:2.0f];
}
![](//images0.cnblogs.com/blog/419711/201310/01135000-739f9bf6fce94e1bae3b0bce9fe3e966.png)
UIImageView的layer操作
- (void)testimageview
{
UIImageView *imageview = [[UIImageView alloc] initWithFrame:CGRectMake(60, 130, 200, 200)];
[imageview setImage:[UIImage imageNamed:@"头像1.png"]];
[self.view addSubview:imageview];
// 因为imageview有多个图层,需要设置图层绑定到bounds,没有这句话,功能不起作用
// 让所有子图层跟随imageview
// 设置这个属性以后,阴影效果失效
[imageview.layer setMasksToBounds:YES];
// 圆角半径
imageview.layer.cornerRadius = 20.0f;
// 设置阴影
[imageview.layer setShadowColor:[UIColor redColor].CGColor];
[imageview.layer setShadowOffset:CGSizeMake(5, 5)];
[imageview.layer setShadowOpacity:0.5f];
// 设置边框
[imageview.layer setBorderColor:[UIColor redColor].CGColor];
[imageview.layer setBorderWidth:3];
}
![](//images0.cnblogs.com/blog/419711/201310/01140252-f5db535ee8f945f4a1b57c6b2f2a3ab5.png)
如果把下边这个行注释掉。
//[imageview.layer setMasksToBounds:YES];
![](//images0.cnblogs.com/blog/419711/201310/01140412-9382d2310f534f52a78d18378622a5b1.png)
圆角半径就是去作用。
设置imageview.layer的形变参数
// 设置imageview的形变参数,这里设置了3个形变操作,只有最后一个起作用。因为只能设置一个
[imageview.layer setTransform:CATransform3DMakeTranslation(0, 100, 0)];
[imageview.layer setTransform:CATransform3DMakeScale(0.5, 2.0, 1)];
[imageview.layer setTransform:CATransform3DMakeRotation(M_PI_4, 0, 0, 1)];
![](//images0.cnblogs.com/blog/419711/201310/01141446-a120fb86c65948a2a5eb9e52375a57da.png)
如果旋转的时候只指定x参数,y,z都设置是0,如果设置转45度,变成的样子
![](//images0.cnblogs.com/blog/419711/201310/01141908-db0250ca81634160b3ce1025b87b6faf.png)
如果旋转90度,就看不见,如果旋转180度,就回翻转。通常在旋转的时候,大部分是按照z轴旋转。
给imageview的layer设置keypath形变
// 设置imageview的形变参数,这里设置了3个形变操作,只有最后一个起作用。因为只能设置一个
// [imageview.layer setTransform:CATransform3DMakeTranslation(0, 100, 0)];
// [imageview.layer setTransform:CATransform3DMakeScale(0.5, 2.0, 1)];
// [imageview.layer setTransform:CATransform3DMakeRotation(M_PI_4, 1, 0, 0)];
// 用keypath来设置形变,这里用的是forKeyPath,不是forKey
// 平移
[imageview.layer setValue:@-100 forKeyPath:@"transform.translation.y"];
[imageview.layer setValue:@2 forKeyPath:@"transform.scale"];
[imageview.layer setValue:@M_PI_2 forKeyPath:@"transform.rotation.z"];
用3种形变得到的效果
效果1
![](//images0.cnblogs.com/blog/419711/201310/01153723-197ee5e382f440caac823684a3558170.png)
效果2
![](//images0.cnblogs.com/blog/419711/201310/01153734-be55472a3fca423dac6cce1e8dbb3e00.png)
效果3
![](//images0.cnblogs.com/blog/419711/201310/01153743-28328182289d42d6a0f5917c67527d18.png)
3种形变同时加上
![](//images0.cnblogs.com/blog/419711/201310/01153834-6437fdef2e064272a2a62ca08b5fe733.png)
说明在用settransform方法的时候只能设置一种形变。
但是在用KVC模式设置keypath方式下,可以设置多种形变同时起作用。
如何找到这些形变参数
![](//images0.cnblogs.com/blog/419711/201310/01154134-7b08b6fc34e54489b1fab1f27f9a907a.png)
设置uiview的layer形变,尽量用keypath方式。这种方式比较灵活。