在CALayer中添加UIImage

时间:2012-11-07 15:12:53

标签: ios uiimageview uiimage calayer subview

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

7 个答案:

答案 0 :(得分:115)

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

如何将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

enter image description here

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

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

myView.layer.contents = UIImage(named: "star")?.cgImage
myView.layer.contentsGravity = kCAGravityTop
myView.layer.isGeometryFlipped = true

在iOS中,如果您正在执行具有顶部或底部重力的任何操作,则可能需要将isGeometryFlipped property设置为true,否则它将与您的预期相反。 (只有重力垂直翻转,而不是内容呈现。如果您在翻转内容时遇到问题,请参阅this answer。)

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

<强> kCAGravityResize

这是默认设置。

enter image description here

<强> kCAGravityResizeAspect

enter image description here

<强> kCAGravityResizeAspectFill

enter image description here

<强> kCAGravityCenter

enter image description here

<强> kCAGravityTop

enter image description here

<强> kCAGravityBottom

enter image description here

<强> kCAGravityLeft

enter image description here

<强> kCAGravityRight

enter image description here

<强> kCAGravityTopLeft

enter image description here

<强> kCAGravityTopRight

enter image description here

<强> kCAGravityBottomLeft

enter image description here

<强> kCAGravityBottomRight

enter image description here

相关

答案 1 :(得分:45)

必须是

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

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

答案 2 :(得分:8)

我删除了

 [layer setNeedsDisplay];

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

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
    }
}

在此示例中,它是一个Button,带有小图标,您将在左上方添加:

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))
    }
}

答案 5 :(得分:0)

myView.layer.contents = UIImage(名称:&#34; star&#34;)?。cgImage

答案 6 :(得分:0)

这应该是评论,但我损失了几个小时,所以我将其作为独立的答案。

我在做:

contents

您能找到问题所在吗?由于Any的类型为myView.layer.contents = UIImage(named: "star").cgImage ,因此可以正常编译。但是正确的代码是:

ng-select