我必须添加一个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];
}
答案 0 :(得分:115)
这是为了未来观众的一般答案。它基于问题标题而不是原始问题的细节。
您只需使用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
property设置为true
,否则它将与您的预期相反。 (只有重力垂直翻转,而不是内容呈现。如果您在翻转内容时遇到问题,请参阅this answer。)
每个UIView
设置下面有两个contentsGravity
示例,一个视图大于UIImage
,另一个视图更小。这样你就可以看到缩放和重力的影响。
<强> kCAGravityResize
强>
这是默认设置。
<强> kCAGravityResizeAspect
强>
<强> kCAGravityResizeAspectFill
强>
<强> kCAGravityCenter
强>
<强> kCAGravityTop
强>
<强> kCAGravityBottom
强>
<强> kCAGravityLeft
强>
<强> kCAGravityRight
强>
<强> kCAGravityTopLeft
强>
<强> kCAGravityTopRight
强>
<强> kCAGravityBottomLeft
强>
<强> kCAGravityBottomRight
强>
答案 1 :(得分:45)
必须是
layer.contents = (id)[UIImage imageNamed:@"myImage.png"].CGImage;
您只能将CGImage放入图层,而不能直接放入UIImage。
答案 2 :(得分:8)
我删除了
[layer setNeedsDisplay];
我不知道为什么,但它确实有效!
答案 3 :(得分:3)
您需要正确设置CALayer的框架,因为默认为CGRectZero。
答案 4 :(得分:2)
在此示例中,图像只是整个视图的大小:
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