在CALayer中添加UIImage
我必须添加一个UIImageView作为MapView的子视图。 为此,我在MapView上创build了一个图层。 在这一层我想把我的形象,但我得到一个白色的矩形,没有别的。 我的图像不可见。
这是代码:
- (void)viewDidLoad { //...... CALayer *layer = [CALayer layer]; layer.backgroundColor = [[UIColor whiteColor] CGColor]; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { layer.bounds = CGRectMake(self.mapView.bounds.origin.x, self.mapView.bounds.origin.y, 80, 300); } else { layer.bounds = CGRectMake(self.mapView.frame.origin.x, self.mapView.frame.origin.y, 150, 700); } layer.contents = (id)[UIImage imageNamed:@"myImage.png"]; //the name is correct but in the output the image is not visible [[self.mapView layer] addSublayer:layer]; [layer setNeedsDisplay]; }
这对于未来的观众来说是一个普遍的答案。 它是基于问题标题而不是原始问题的细节。
如何将UIImage添加到CALayer
您只需使用其contents
属性即可将图像添加到视图的layer
:
myView.layer.contents = UIImage(named: "star")?.cgImage
- 请注意,
UIImage
需要转换为CGImage
。
如果你想在自己的图层中添加图像,你可以这样做:
let myLayer = CALayer() let myImage = UIImage(named: "star")?.cgImage myLayer.frame = myView.bounds myLayer.contents = myImage myView.layer.addSublayer(myLayer)
修改外观
上面的代码产生一个像这样的视图。 浅蓝色是UIView
,深蓝色是UIImage
。
正如你所看到的,虽然,它看起来像素化。 这是因为UIImage
比UIView
小,所以它被缩放以填充视图,这是默认的,你不指定任何东西。
下面的例子显示了图层contentsGravity
重要性的变化。 代码如下所示:
myView.layer.contents = UIImage(named: "star")?.cgImage myView.layer.contentsGravity = kCAGravityTop myView.layer.isGeometryFlipped = true
在iOS中,如果您正在使用顶部或底部重力进行任何操作,则可能需要将isGeometryFlipped
属性设置为true
,否则将与您所期望的相反。 (只有重力垂直翻转,而不是内容渲染,如果翻转的内容有问题,请看这个答案 。)
下面有两个UIView
示例,每个contentsGravity
设置,一个视图大于UIImage
,另一个视图小一些。 这样你可以看到比例和重力的影响。
kCAGravityResize
这是默认的。
kCAGravityResizeAspect
kCAGravityResizeAspectFill
kCAGravityCenter
kCAGravityTop
kCAGravityBottom
kCAGravityLeft
kCAGravityRight
kCAGravityTopLeft
kCAGravityTopRight
kCAGravityBottomLeft
kCAGravityBottomRight
有关
- 视图的内容模式属性
- 使用
CGContextDrawImage
在drawRect
绘制UIImage
- CALayer教程:入门
它一定要是
layer.contents = (id)[UIImage imageNamed:@"myImage.png"].CGImage;
您只能将CGImage放入图层,而不是直接放入UIImage。
我删除了
[layer setNeedsDisplay];
我不知道为什么,但它的作品!
您需要正确设置CALayer的框架,因为默认值是CGRectZero。
myView.layer.contents = UIImage(命名为“star”)?。cgImage