52

我必须添加一个 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];
}
4

7 回答 7

162

为了未来的观众,这是一个普遍的答案。它基于问题标题而不是原始问题的详细信息。

如何将 UIImage 添加到 CALayer

layer您可以简单地使用其contents属性将图像添加到视图中:

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

在此处输入图像描述

有关的

于 2016-01-05T03:23:15.183 回答
47

它一定要是

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

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

于 2012-11-07T15:39:35.167 回答
9

我删除了

 [layer setNeedsDisplay];

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

于 2012-11-08T11:27:27.203 回答
4

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

于 2014-03-26T15:18:41.070 回答
3

2020,完整的简单示例

在此示例中,图像只是整体视图的大小:

class ImageyView: UIView {
    
    private lazy var im: CALayer = {
        let l = CALayer()
        l.contents = UIImage(named: "some_background")?.cgImage
        l.contentsGravity = .resizeAspect
        layer.addSublayer(l)
        return l
    }()
    
    override func layoutSubviews() {
        super.layoutSubviews()
        im.frame = bounds
    }
}

在此示例中,它是一个按钮,您在左上角添加了小图标:

class BroadcastButton: UIButton {
    
    private lazy var im: CALayer = {
        let l = CALayer()
        l.contents = UIImage(named: "your_icon")?.cgImage
        l.contentsGravity = .resizeAspect
        layer.addSublayer(l)
        return l
    }()
    
    override func layoutSubviews() {
        super.layoutSubviews()
        im.frame = CGRect(origin: CGPoint(x: 2, y: 2),
             size: CGSize(width: 14, height: 14))
    }
}
于 2020-07-03T16:33:59.843 回答
0

myView.layer.contents = UIImage(named: "star")?.cgImage

于 2017-10-30T07:30:42.903 回答
0

这应该是一个评论,但我浪费了几个小时,所以我把它作为一个独立的答案。

我在做:

myView.layer.contents = UIImage(named: "star")

你能找出问题所在吗?因为contents是类型Any,所以编译得很好。但正确的代码是:

myView.layer.contents = UIImage(named: "star").cgImage
于 2020-11-17T18:58:20.437 回答