1、contents
寄宿图如其名,它本身并不是这一块的,只是被放在这里寄宿的。在Core Animation中CALayer有一个属性叫做contents,它被定义为id类型,意味着contends可以是任何类型的对象,但除非我们给contents赋CGImage类型的值,否则得到的将是一片空白。
但是我们并不能直接给contents赋值,Core Foundation和Cocoa的类型不能够兼容,所以我们需要对赋值的image做一个类型转化,上一篇博客中我们创建了一个简单的CALayer项目,现在我们往工程中加入一张图片,并赋值给contents,如下:
layer.contents = (__bridge id)image.CGImage;
此处UIImage有一个CGImage属性,它返回一个CGImageRef类型,直接赋值的话编辑器会报错,因为它不是一个Cocoa对象,而是一个Core Foundation类型,所以才有了上面的转化。
2.contentGravity
在视图中我们叫做contentModel,而在图层中,我们叫做contentGravity,它的作用是调整图片的比例,因为我们加载的图片有时候并不是很合适这个图层或者视图,所以这会导致图片变形,那么为了很好的解决这个问题我们用contentGravity或者contentModel来对图片做一些调整:
在view中
view.contentMode = UIViewContentModeScaleAspectFit;
在CALayer中
self.layerView.layer.contentsGravity = kCAGravityResizeAspect;
这是一个枚举,它还有其他的值可以设置,大家可以自己在工程里面查看。
3.contentsScale
contentsScale是寄宿图的像素尺寸和视图大小的比例,默认为1.0,当这个属性设置为1.0的时候代表每个点为一个像素绘制图片,当为2.0的时候代表每个点为两个像素绘制图片。在我们开发中,经常会用到一倍图,二倍图,甚至三倍图,说的其实就是这个。它的作用是拉伸图片以适应图层,并不会考虑到分辨率的问题,所以设置太高图片就会显示颗粒状,在使用UIImage设置图片的时候,由于CGImage没有拉伸的概念,所以在转化的时候CGImage就丢失了,而UIImage直接读取了高质量的retain图片,就会使图片像素很低,出现模糊,这时候我们可以手动来修复这个问题,设置CALayer的contentsScale为图片的scale:
UIImage *image = [UIImage imageNamed:@"Snowman.png"]; self.layerView.layer.contents = (__bridge id)image.CGImage; self.layerView.layer.contentsGravity = kCAGravityCenter; self.layerView.layer.contentsScale = image.scale;
当没有图片时,我们设置为屏幕的scale
layer.contentsScale = [UIScreen mainScreen].scale;