2012-11-07 12 views
26

MapViewのサブビューとしてUIImageViewを追加する必要があります。これを行うために、私は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

これも私の仕事でした。 Adrianaに感謝します。 –

41

それはあなたが唯一の直接層ではなく、UIImageにCGImageを置くことができます

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

なければなりません。

3

デフォルトはCGRectZeroなので、CALayerのフレームを適切に設定する必要があります。

77

これは将来の視聴者のための一般的な回答です。元の質問の詳細ではなく、質問のタイトルに基づいています。あなたは、単にそのcontentsプロパティを使用して、ビューのlayerに画像を追加することができますCALayerの

にUIImageを追加する方法

UIImageニーズをに変換すること

myView.layer.contents = UIImage(named: "star")?.cgImage 
  • 注意a 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版では、あなたは上部または下部の重力を使って何をやっている場合trueisGeometryFlipped propertyを設定したい場合があり、それ以外の場合は、あなたが期待するものとは逆になります。 (重力のみが、縦にないコンテンツのレンダリングを反転している。あなたが反転しているコンテンツに問題がある場合は、this answerを参照してください。)すべてのcontentsGravity設定については、以下の2つのUIView例があります

、1つのビューはUIImageよりも大きくなっていますもう1つは小さい。この方法でスケーリングと重力の効果を見ることができます。

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

コンテンツレットを適切な比率に調整することはそのトリックです。別のオプションは、UIViewのmaskViewとしてUIImageViewを使用することです。 – tcurdt

0

myView.layer.contents = UIImage(命名: "スター")?。cgImage

+2

答えに詳細を記入してください。あなたの答えが完全な解決策であっても、あなたのコードが何をしているのか、どのように思いついたのかを説明する時間があれば、質問者はもっと学びます。 – Jolta

関連する問題