web-dev-qa-db-fra.com

ajouter UIImage dans CALayer

Je dois ajouter un UIImageView comme sous-vue de MapView. Pour ce faire, j'ai créé une couche au-dessus de MapView. Dans ce calque, je veux mettre mon image, mais je reçois un rectangle blanc et rien d'autre. Mon image n'est pas visible.

Voici le 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];
}
37
Adriana Carelli

J'ai enlevé

 [layer setNeedsDisplay];

Je ne sais pas pourquoi, mais ça marche!

9
Adriana Carelli

Ceci est une réponse générale pour le bien des futurs téléspectateurs. Il est basé sur le titre de la question plutôt que sur les détails de la question d'origine.

Comment ajouter un UIImage à un CALayer

Vous pouvez ajouter une image au layer d'une vue simplement en utilisant sa propriété contents:

myView.layer.contents = UIImage(named: "star")?.cgImage
  • Notez que le UIImage doit être converti en CGImage.

Si vous souhaitez ajouter l'image dans son propre calque, vous pouvez le faire comme ceci:

let myLayer = CALayer()
let myImage = UIImage(named: "star")?.cgImage
myLayer.frame = myView.bounds
myLayer.contents = myImage
myView.layer.addSublayer(myLayer)

Modification de l'apparence

Le code ci-dessus produit une vue comme celle-ci. Le bleu clair est le UIView et l'étoile bleu foncé est le UIImage.

enter image description here

Comme vous pouvez le voir, il semble pixelisé. En effet, le UIImage est plus petit que le UIView, il est donc mis à l'échelle pour remplir la vue, qui est la valeur par défaut si vous ne spécifiez rien d'autre.

Les exemples ci-dessous montrent des variations de la propriété contentsGravity du calque. Le code ressemble à ceci:

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

Dans iOS, vous pouvez définir la propriété isGeometryFlipped sur true si vous faites quoi que ce soit avec une gravité supérieure ou inférieure, sinon ce sera l'opposé de ce que vous attendre. (Seule la gravité est retournée verticalement, pas le rendu du contenu. Si vous rencontrez des problèmes avec le contenu retourné, voir cette réponse .)

Il existe deux exemples UIView ci-dessous pour chaque paramètre contentsGravity, une vue est plus grande que UIImage et l'autre est plus petite. De cette façon, vous pouvez voir les effets de la mise à l'échelle et de la gravité.

kCAGravityResize

C'est la valeur par défaut.

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

En relation

126
Suragch

ça doit être

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

Vous pouvez uniquement placer un CGImage dans un calque, pas directement un UIImage.

45
Bastian

Vous devez définir correctement le cadre de CALayer, car la valeur par défaut est CGRectZero.

3
Soul Clinic

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

0
JonyFang