在CALayer中添加UIImage

Adr*_*lli 40 subview calayer uiimageview uiimage ios

我必须添加一个UIImageView作为MapView的子视图.为此,我在MapView上创建了一个图层.在这一层,我想放置我的图像,但我得到一个白色的矩形,没有别的.我的图片不可见.

这是代码:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

Sur*_*gch 131

这是为了未来观众的一般答案.它基于问题标题而不是原始问题的细节.

如何将UIImage添加到CALayer

layer只需使用其contents属性即可将图像添加到视图中:

myView.layer.contents = UIImage(named: "star")?.cgImage
Run Code Online (Sandbox Code Playgroud)
  • 注意UIImage需要转换为CGImage.

如果您希望在自己的图层中添加图像,可以这样做:

let myLayer = CALayer()
let myImage = UIImage(named: "star")?.cgImage
myLayer.frame = myView.bounds
myLayer.contents = myImage
myView.layer.addSublayer(myLayer)
Run Code Online (Sandbox Code Playgroud)

修改外观

上面的代码生成了这样的视图.淡蓝色是UIView深蓝色的星星UIImage.

在此输入图像描述

但是,正如您所看到的,它看起来像是像素化的.这是因为UIImage它小于UIView缩放以填充视图,这是默认情况下您不指定任何其他内容.

以下示例显示了图层contentsGravity属性的变化.代码如下所示:

myView.layer.contents = UIImage(named: "star")?.cgImage
myView.layer.contentsGravity = kCAGravityTop
myView.layer.isGeometryFlipped = true
Run Code Online (Sandbox Code Playgroud)

在iOS中,您可能需要设置isGeometryFlipped属性true,如果你正在做的顶部或底部重力什么,否则这将是你所期望的相反.(只有重力垂直翻转,而不是内容渲染.如果您在翻转内容时遇到问题,请参阅此答案.)

UIView每个contentsGravity设置下面有两个示例,一个视图大于另一个视图,另一个视图UIImage小.这样你就可以看到缩放和重力的影响.

kCAGravityResize

这是默认值.

在此输入图像描述

kCAGravityResizeAspect

在此输入图像描述

kCAGravityResizeAspectFill

在此输入图像描述

kCAGravityCenter

在此输入图像描述

kCAGravityTop

在此输入图像描述

kCAGravityBottom

在此输入图像描述

kCAGravityLeft

在此输入图像描述

kCAGravityRight

在此输入图像描述

kCAGravityTopLeft

在此输入图像描述

kCAGravityTopRight

在此输入图像描述

kCAGravityBottomLeft

在此输入图像描述

kCAGravityBottomRight

在此输入图像描述

有关

  • 将 contentsRect 调整到正确的比例可以解决问题。另一种选择是使用 UIImageView 作为 UIView maskView。 (2认同)

Bas*_*ian 45

它一定要是

layer.contents = (id)[UIImage imageNamed:@"myImage.png"].CGImage;
Run Code Online (Sandbox Code Playgroud)

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


Adr*_*lli 8

我删除了

 [layer setNeedsDisplay];
Run Code Online (Sandbox Code Playgroud)

我不知道为什么,但它的确有效!

  • 我猜setNeedsDisplay使图层重绘内容,因此删除图像. (3认同)
  • 为此加一个。它肯定会触发重绘(我认为它需要),但它会在重绘之前丢弃“内容”。 (2认同)