CALayer一些知识~...2
那既然CALayer是负责UIView上显示内容的,那我们如果想在UIView上展示一些内容能不能直接创建CALayer然后添加到UIView上的CALayer上呢?答案是肯定的(但是CALayer不能脱离UIView直接显示给用户,必须添加到UIView上的CALayer
// 1. 自定义一个子图层,添加到当前根视图中 CALayer *myLayer = [CALayer layer]; myLayer.frame = CGRectMake(0, 0, 320, 100);
myLayer.backgroundColor = [UIColor redColor].CGColor
// 2. 添加到跟图层 [self.view.layer addSublayer:myLayer];
基本跟创建一个UIView一样,创建完成添加到UIView的Layer上即可显示
但是给CALayer设置背景色的时候不能用UIColor,而要使用更底层的CGColor,UIColor已经提供了一个属性来取出CGColor
效果如下
但是跟设置UIView的大小位置不同的是CALayer可以通过设置position和bounds属性来设置其位置和大小,并且可以通过设置锚点(anchorPoint)来设置位置
什么是锚点呢?锚点的数值怎么取呢?
锚点就类似于一个视图上的定位点默认是(0.5,0.5)这么一个点,这里面的0.5不是坐标,而是相对与自身的大小而言的看下图
某一个Layer的锚点其实就是相对于自身长宽比例点,默认(0.5,0.5)就是Layer的中心点如果改为(0,0)就是Layer的左上角的点(1,1)就是右下角的点
锚点是跟position属性结合用的,设置Layer的position是以锚地为基准点的(这句话怎么理解呢?)
加入一个图层mLayer的锚点是(0,0)(左上角的点)这时设置Layer的position属性为(100,100),那Layer上哪一个点重合呢,很显然就是跟锚点重合啦~~
下面我们来看下效果,看下面这个段代码
// 1. 自定义一个子图层,添加到当前根视图中 CALayer *myLayer = [CALayer layer]; // 设置图层的属性 // 1) 大小 myLayer.bounds = CGRectMake(0, 0, 100, 100); // 2) 位置 myLayer.position = CGPointMake(100, 100); // 3) 背景颜色 myLayer.backgroundColor = [UIColor redColor].CGColor; // 4) 设置锚点,又称定位点,默认值是(0.5, 0.5) 数值范围0~1 myLayer.anchorPoint = CGPointMake(0, 0); // myLayer.anchorPoint = CGPointMake(1, 1); // 2. 添加到跟图层 [self.view.layer addSublayer:myLayer];
当上面锚点为0,0的时候效果如左图,1,1的时候如右图
既然Layer可以显示内容,图片当然不能少啦
Layer如何加载图片呢?
看下面的代码
// 提示:要使用图像,不能直接使用UIImage,需要转换成CGImage,再使用id强转即可 UIImage *image = [UIImage imageNamed:@"头像1"]; myLayer.contents = (id)[image CGImage];
只需要设置Layer的contents属性就可以了,但是设置图片的时候也不能用UIImage而是要用CGImage~
但是这种设置的图片无法与用户交互
通过下面的示例代码(结合Touch事件)你可以很好地理解锚点
- (void)viewDidLoad { [super viewDidLoad]; // 1. 自定义一个子图层,添加到当前根视图中 CALayer *myLayer = [CALayer layer]; // 设置图层的属性 // 1) 大小 myLayer.bounds = CGRectMake(0, 0, 100, 100); // 2) 位置 myLayer.position = CGPointMake(100, 100); // 3) 背景颜色 myLayer.backgroundColor = [UIColor redColor].CGColor; // 4) 设置锚点,又称定位点,默认值是(0.5, 0.5) 数值范围0~1 myLayer.anchorPoint = CGPointMake(0, 0); // 5) 设置图像 // 提示:要使用图像,不能直接使用UIImage,需要转换成CGImage,再使用id强转即可 UIImage *image = [UIImage imageNamed:@"头像1"]; myLayer.contents = (id)[image CGImage]; // 2. 添加到跟图层 [self.view.layer addSublayer:myLayer]; //self.myLayer = myLayer; } #pragma mark - 触摸事件 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (self.myLayer.anchorPoint.x == 0) { self.myLayer.anchorPoint = CGPointMake(1.0, 1.0); } else { self.myLayer.anchorPoint = CGPointMake(0.0, 0.0); } }
挺好玩的一段代码~