在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

在这里输入图像说明

正如你所看到的,虽然,它看起来像素化。 这是因为UIImageUIView小,所以它被缩放以填充视图,这是默认的,你不指定任何东西。

下面的例子显示了图层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

在这里输入图像说明

有关

  • 视图的内容模式属性
  • 使用CGContextDrawImagedrawRect绘制UIImage
  • CALayer教程:入门

它一定要是

 layer.contents = (id)[UIImage imageNamed:@"myImage.png"].CGImage; 

您只能将CGImage放入图层,而不是直接放入UIImage。

我删除了

  [layer setNeedsDisplay]; 

我不知道为什么,但它的作品!

您需要正确设置CALayer的框架,因为默认值是CGRectZero。

myView.layer.contents = UIImage(命名为“star”)?。cgImage