2012-11-07 34 views
26

我必須添加一個UIImageView作爲MapView的子視圖。爲此,我在MapView上創建了一個圖層。在這一層我想把我的形象,但我得到一個白色的矩形,沒有別的。我的圖像不可見。在CALayer中添加UIImage

這是代碼:

- (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]; 
} 

回答

6

我刪除

[layer setNeedsDisplay]; 

我不知道爲什麼,但它的工程!

+2

我想setNeedsDisplay使圖層重繪內容,因此刪除圖像。 – Bastian

+0

這也有效。謝謝阿德里安娜。 –

41

它必須是

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

你只能把一個CGImage成層,而不是直接的UIImage。

3

您需要正確設置CALayer的框架,因爲默認值爲CGRectZero。

77

這是一個普遍的答案,爲了未來的觀衆。它基於問題標題而不是原始問題的細節。

如何一個UIImage添加到CALayer的

你可以簡單地通過使用其contents性的圖像添加到視圖的layer

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

正如你所看到的,但是,它看起來像素化。這是因爲UIImageUIView小,因此它被縮放以填充視圖,這是默認值,您不指定任何其他值。

以下示例顯示了圖層的contentsGravity屬性的變體。代碼如下所示:

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

在iOS中,您可能需要設置isGeometryFlipped propertytrue如果你正在做與頂部或底部重力什麼,否則這將是你所期望的相反。 (只有重力垂直翻轉,而不是內容呈現。如果你有被翻動與內容問題,請參閱this answer

有低於每contentsGravity的設置有2 UIView例子,一個視圖比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

相關

+0

很好的答案。但是,您如何在同一時間執行kCAGravityResizeAspectFill和kCagravityTop? – tcurdt

+1

調整contentsRect到正確的比例是訣竅。另一種選擇是使用UIImageView作爲UIView maskView。 – tcurdt

0

myView.layer.contents =的UIImage(命名爲: 「星」)?cgImage

+2

請在回答中提供更多詳情。即使你的答案是一個完整的解決方案,如果你花時間解釋你的代碼的作用,以及你如何提出它,提問者將學到更多。 – Jolta