创建寄宿图的几种方式


我们知道,每个UIView都有一个属性layer,它是一个CALayer类的实例,也就是所谓的backing layer。

下面总结了为backing layer创建寄宿图的几种方式。

给layer的contents属性赋值

contents属性需要一个CGImageRef类型的值,同时只有Cocoa对象对它有效;但是CGImageRef并不是Cocoa对象,而是CoreFoundation对象,所以还需要做一个额外的桥接操作。例如:

imagelayer.contents  = (__bridge id )(image.CGImage);

注意:

  1. UIImage仍然有关于分辨率的信息,但是CGImage关于分辨率的信息丢失了。如果实在2.0的屏幕上,要记得设置contentScale属性。
  2. 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

知识共享许可协议本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,请务必在遵守许可协议的前提下转载。
发布时间:2019-07-25 16:47:46 阅读:95 标签:技术iOS