在此先贴上我学习的参考博客:http://www.cnblogs.com/kenshincui/p/3972100.html
CALayer基本介绍:
在iOS中CALayer的设计主要是了为了内容展示和动画操作,CALayer本身并不包含在UIKit中,它不能响应事件。由于CALayer在设计之初就考虑它的动画操作功能,CALayer很多属性在修改时都能形成动画效果,这种属性称为“隐式动画属性”。但是对于UIView的根图层而言属性的修改并不形成动画效果,因为很多情况下根图层更多的充当容器的做用,如果它的属性变动形成动画效果会直接影响子图层。另外,UIView的根图层创建工作完全由iOS负责完成,无法重新创建,但是可以往根图层中添加子图层或移除子图层。
我的理解为以下几点:1.CALayer不能响应事件 2.CALayer很多属性在修改时都能形成动画效果,这种属性还有一个名字——“隐式动画属性” 3.CALayer的根图层而言,属性的修改不能形成动画 4.UIView的根图层无法重新创建,但是可以添加(删除)子图层
下表列出了CALayer常用的属性:
属性 | 说明 | 是否支持隐式动画 |
---|---|---|
anchorPoint | 和中心点position重合的一个点,称为“锚点”,锚点的描述是相对于x、y位置比例而言的默认在图像中心点(0.5,0.5)的位置 | 是 |
backgroundColor | 图层背景颜色 | 是 |
borderColor | 边框颜色 | 是 |
borderWidth | 边框宽度 | 是 |
bounds | 图层大小 | 是 |
contents | 图层显示内容,例如可以将图片作为图层内容显示 | 是 |
contentsRect | 图层显示内容的大小和位置 | 是 |
cornerRadius | 圆角半径 | 是 |
doubleSided | 图层背面是否显示,默认为YES | 否 |
frame | 图层大小和位置,不支持隐式动画,所以CALayer中很少使用frame,通常使用bounds和position代替 | 否 |
hidden | 是否隐藏 | 是 |
mask | 图层蒙版 | 是 |
maskToBounds | 子图层是否剪切图层边界,默认为NO | 是 |
opacity | 透明度 ,类似于UIView的alpha | 是 |
position | 图层中心点位置,类似于UIView的center | 是 |
shadowColor | 阴影颜色 | 是 |
shadowOffset | 阴影偏移量 | 是 |
shadowOpacity | 阴影透明度,注意默认为0,如果设置阴影必须设置此属性 | 是 |
shadowPath | 阴影的形状 | 是 |
shadowRadius | 阴影模糊半径 | 是 |
sublayers | 子图层 | 是 |
sublayerTransform | 子图层形变 | 是 |
transform | 图层形变 | 是 |
// // KCMainViewController.m // CALayer // // Created by Kenshin Cui on 14-3-22. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // #import "KCMainViewController.h" #define WIDTH 50 @interface KCMainViewController () @end @implementation KCMainViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self drawMyLayer]; } #pragma mark 绘制图层 -(void)drawMyLayer{ CGSize size=[UIScreen mainScreen].bounds.size; //获得根图层 CALayer *layer=[[CALayer alloc]init]; //设置背景颜色,由于QuartzCore是跨平台框架,无法直接使用UIColor layer.backgroundColor=[UIColor colorWithRed:0 green:146/255.0 blue:1.0 alpha:1.0].CGColor; //设置中心点 layer.position=CGPointMake(size.width/2, size.height/2); //设置大小 layer.bounds=CGRectMake(0, 0, WIDTH,WIDTH); //设置圆角,当圆角半径等于矩形的一半时看起来就是一个圆形 layer.cornerRadius=WIDTH/2; //设置阴影 layer.shadowColor=[UIColor grayColor].CGColor; layer.shadowOffset=CGSizeMake(2, 2); layer.shadowOpacity=.9; //设置边框 // layer.borderColor=[UIColor whiteColor].CGColor; // layer.borderWidth=1; //设置锚点 // layer.anchorPoint=CGPointZero; [self.view.layer addSublayer:layer]; } #pragma mark 点击放大 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch=[touches anyObject]; CALayer *layer=self.view.layer.sublayers[0]; CGFloat width=layer.bounds.size.width; if (width==WIDTH) { width=WIDTH*4; }else{ width=WIDTH; } layer.bounds=CGRectMake(0, 0, width, width); layer.position=[touch locationInView:self.view]; layer.cornerRadius=width/2; } @end
于是,我在if(width== WIDTH)和else两个地方设置了断点,并且打印了width的值,打印了self.view.layer.sublayers:也就是所有儿子,我发现一个奇怪的问题,width为0,这很奇怪,而且self.view.sublayers有三个对象,这就让我想要测试一下,我把self.view.layer.sublayers[0]中的0变成1,2试了一试,发现http://blog.csdn.net/wscqqlucy/article/details/84432362有反应。这个是我的一个疑问,self.view.layer 我就add了一个layer啊,所以他自己应该也有layer,哪是那些layer呢?
于是看了另一个博客:http://blog.csdn.net/wscqqlucy/article/details/8443236 ,看了好久看到这么一句话:
当你用 addSublayer 来添加一个子图层时,他会被添加到图层层次结构的顶层,所以他会显示在现有所有子图层的最前面。用一组名为 insertSublayer 的替代方法,你可以将新视图插入现有的图层之间。
这个说明没有加layer的时候,他自己就有两个layer,所以add 自己创建的这个layer的时候,这个layer变成了最外面的这个。至于这两个到底是哪两个,我敢肯定的是其中一个肯定是self.view.layer。
这段代码是动态改变了layer属性中的bounds和position,是“隐身动画属性”。