创建寄宿图的几种方式
我们知道,每个UIView都有一个属性layer,它是一个CALayer类的实例,也就是所谓的backing layer。
下面总结了为backing layer创建寄宿图的几种方式。
给layer的contents属性赋值
contents属性需要一个CGImageRef类型的值,同时只有Cocoa对象对它有效;但是CGImageRef并不是Cocoa对象,而是CoreFoundation对象,所以还需要做一个额外的桥接操作。例如:
imagelayer.contents = (__bridge id )(image.CGImage);
注意:
- UIImage仍然有关于分辨率的信息,但是CGImage关于分辨率的信息丢失了。如果实在2.0的屏幕上,要记得设置contentScale属性。
- contensGravity适应图层边界的设置,可能会让contentScale的设置不起作用。但并不是所有的gravity值都会失效。只有为了适应边界而做了拉伸的设置才会让contentScale失效。一起使用的情况通常如下:
imagelayer.contentsGravity = kCAGravityCenter;
imagelayer.contentsScale = image.scale;
实现UIView的-drawRect:方法。
如果UIView检测到此方法被实现,就会分配一个寄宿图给View。如果不需要的话,最好不要实现该方法,避免浪费内存喝CPU。
实现CALayerDelegate协议的相关方法
当CALayer需要备重绘时,它首先会通过尝试调用如下方法来请求它的代理(实现了CALayerDelegate协议)给它一个寄宿图来显示。
–(void)displayLayer:(CALayerCALayer *)layer;
如果没有实现这个方法,会接着尝试调用如下方法:
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx