I must add a UIImageView as subview of MapView. To do this I created a layer above the MapView. In this layer I want to put my image, but I get a white rectangle and nothing else. My image is not visible.
This is the code:
- (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的
您可以添加到一个视图的图像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
有关
- 的视图的内容属性模式
- 绘制
UIImage
中drawRect
与CGContextDrawImage
- CALayer的教程:入门
它一定要是
layer.contents = (id)[UIImage imageNamed:@"myImage.png"].CGImage;
你只能把一个CGImage成层,而不是直接的UIImage。
您需要正确设置的CALayer的框架,因为默认是CGRectZero。