程序员

【CALayer】iOS中的图层

2018-06-05  本文已影响9人  大基本功

CALayer是什么

UIView和CALayer的选择

图层的添加

1️⃣添加一个简单的图层
 1 CALayer *myLayer = [CALayer layer];
 2 // 设置层的宽度和高度(100x100)
 3 myLayer.bounds = CGRectMake(0, 0, 100, 100);
 4 // 设置层的位置
 5 myLayer.position = CGPointMake(100, 100);
 6 // 设置层的背景颜色:红色
 7 myLayer.backgroundColor = [UIColor redColor].CGColor;
 8 // 设置层的圆角半径为10
 9 myLayer.cornerRadius = 10;
10
11 // 添加myLayer到控制器的view的layer中
12 [self.view.layer addSublayer:myLayer];
2️⃣添加一个显示图片的图层
1 CALayer *myLayer = [CALayer layer];
 2 // 设置层的宽度和高度(100x100)
 3 myLayer.bounds = CGRectMake(0, 0, 100, 100);
 4 // 设置层的位置
 5 myLayer.position = CGPointMake(100, 100);
 6 // 设置需要显示的图片
 7 myLayer.contents = (id)[UIImage imageNamed:@"lufy.png"].CGImage;
 8 // 设置层的圆角半径为10
 9 myLayer.cornerRadius = 10;
10 // 如果设置了图片,需要设置这个属性为YES才有圆角效果
11 myLayer.masksToBounds = YES;
12
13 // 添加myLayer到控制器的view的layer中
14 [self.view.layer addSublayer:myLayer];
3️⃣为什么CALayer中使用CGColorRef和CGImageRef这2种数据类型,而不用UIColor和UIImage?

UIView和CALayer的其他关系

CALayer中的position和anchorPoint属性

1.创建一个CALayer,添加到控制器的view的layer中
1 CALayer *myLayer = [CALayer layer];
 2 // 设置层的宽度和高度(100x100)
 3 myLayer.bounds = CGRectMake(0, 0, 100, 100);
 4 // 设置层的位置
 5 myLayer.position = CGPointMake(100, 100);
 6 // 设置层的背景颜色:红色
 7 myLayer.backgroundColor = [UIColor redColor].CGColor;
 8
 9 // 添加myLayer到控制器的view的layer中
10 [self.view.layer addSublayer:myLayer];

第5行设置了myLayer的position为(100, 100),又因为anchorPoint默认是(0.5, 0.5),所以最后的效果是:myLayer的中点会在父层的(100, 100)位置


2.若将anchorPoint改为(0, 0),myLayer的左上角会在(100, 100)位置
3.若将anchorPoint改为(1, 1),myLayer的右下角会在(100, 100)位置
4.将anchorPoint改为(0, 1),myLayer的左下角会在(100, 100)位置

总结anchorPoint的用途:它决定着CALayer身上的哪个点会在position所指定的位置上。它的x、y取值范围都是0~1,默认值为(0.5, 0.5),因此,默认情况下,CALayer的中点会在position所指定的位置上。当anchorPoint为其他值时,以此类推。

自定义层

方法1

1️⃣创建一个CALayer的子类

#import<QuartzCore/QuartzCore.h>
@interface MJLayer:CALayer
@end

2️⃣在.m文件中覆盖drawInContext:方法,在里面绘图

1 @implementation MJLayer
 2
 3 #pragma mark 绘制一个实心三角形
 4 - (void)drawInContext:(CGContextRef)ctx {
 5     // 设置为蓝色
 6     CGContextSetRGBFillColor(ctx, 0, 0, 1, 1);
 7
 8    
 9     // 设置起点
10     CGContextMoveToPoint(ctx, 50, 0);
11     // 从(50, 0)连线到(0, 100)
12     CGContextAddLineToPoint(ctx, 0, 100);
13     // 从(0, 100)连线到(100, 100)
14     CGContextAddLineToPoint(ctx, 100, 100);
15     // 合并路径,连接起点和终点
16     CGContextClosePath(ctx);
17    
18     // 绘制路径
19     CGContextFillPath(ctx);
20 }
21
22 @end

3️⃣在控制器中添加图层到屏幕上

1 MJLayer *layer = [MJLayer layer];
2 // 设置层的宽高
3 layer.bounds = CGRectMake(0, 0, 100, 100);
4 // 设置层的位置
5 layer.position = CGPointMake(100, 100);
6 // 开始绘制图层
7 [layer setNeedsDisplay];
8 [self.view.layer addSublayer:layer];

注意第7行,需要调用setNeedsDisplay这个方法,才会触发drawInContext:方法的调用,然后进行绘图

方法2

方法描述:设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法,当CALayer需要绘图时,会调用delegate的drawLayer:inContext:方法进行绘图。


1️⃣创建新的层,设置delegate,然后添加到控制器的view的layer中

1 CALayer *layer = [CALayer layer];
 2 // 设置delegate
 3 layer.delegate = self;
 4 // 设置层的宽高
 5 layer.bounds = CGRectMake(0, 0, 100, 100);
 6 // 设置层的位置
 7 layer.position = CGPointMake(100, 100);
 8 // 开始绘制图层
 9 [layer setNeedsDisplay];
10 [self.view.layer addSublayer:layer];

2️⃣让CALayer的delegate(前面设置的是控制器)实现drawLayer:inContext:方法

 1 #pragma mark 画一个矩形框
 2 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
 3     // 设置蓝色
 4     CGContextSetRGBStrokeColor(ctx, 0, 0, 1, 1);
 5     // 设置边框宽度
 6     CGContextSetLineWidth(ctx, 10);
 7    
 8     // 添加一个跟层一样大的矩形到路径中
 9     CGContextAddRect(ctx, layer.bounds);
10    
11     // 绘制路径
12     CGContextStrokePath(ctx);
13 }

总结

1️⃣无论采取哪种方法来自定义层,都必须调用CALayer的setNeedsDisplay方法才能正常绘图。
2️⃣UIView的详细显示过程
上一篇 下一篇

猜你喜欢

热点阅读