web-dev-qa-db-ja.com

CALayerにUIImageを追加

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

私は削除しました

 [layer setNeedsDisplay];

理由はわかりませんが、うまくいきます!

9
Adriana Carelli

これは、将来の視聴者のための一般的な回答です。元の質問の詳細ではなく、質問のタイトルに基づいています。

UIImageをCALayerに追加する方法

layerプロパティを使用するだけで、ビューのcontentsに画像を追加できます。

myView.layer.contents = UIImage(named: "star")?.cgImage
  • UIImageCGImageに変換する必要があることに注意してください。

画像を独自のレイヤーに追加する場合は、次のようにできます。

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プロパティtrueに設定したい場合があります。期待する。 (重力だけが垂直に反転され、コンテンツのレンダリングは反転されません。反転されるコンテンツに問題がある場合は、 this answer を参照してください。)

UIViewの設定ごとに2つのcontentsGravityの例があります。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

関連する

126
Suragch

でなければならない

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

UIImageではなく、CGImageをレイヤーにのみ配置できます。

45
Bastian

デフォルトはCGRectZeroであるため、CALayerのフレームを正しく設定する必要があります。

3
Soul Clinic

myView.layer.contents = UIImage(named: "star")?. cgImage

0
JonyFang