append UIImage dans CALayer

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

C'est 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]; } 

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

Comment append un UIImage à un CALayer

Vous pouvez append une image à la layer une vue en utilisant simplement sa propriété de contents :

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

Si vous souhaitez append 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) 

Modifier l'apparence

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

entrez la description de l'image ici

Comme vous pouvez le voir, cependant, il semble pixélisé. C'est parce que UIImage est plus petit que UIView donc il est mis à l'échelle pour remplir la vue, ce qui est la valeur par défaut, vous ne spécifiez rien d'autre.

Les exemples ci-dessous montrent des variations sur la propriété contentsGravity la couche. 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 quelque chose avec la gravité haut ou bas, sinon ce sera le contraire de ce que vous attendez. (Seule la gravité est returnnée verticalement, pas le rendu du contenu Si vous rencontrez des problèmes avec le contenu returnné, consultez cette réponse .)

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

kCAGravityResize

C'est la valeur par défaut.

entrez la description de l'image ici

kCAGravityResizeAspect

entrez la description de l'image ici

kCAGravityResizeAspectFill

entrez la description de l'image ici

kCAGravityCenter

entrez la description de l'image ici

kCAGravityTop

entrez la description de l'image ici

kCAGravityBottom

entrez la description de l'image ici

kCAGravityLeft

entrez la description de l'image ici

kCAGravityRight

entrez la description de l'image ici

kCAGravityTopLeft

entrez la description de l'image ici

kCAGravityTopRight

entrez la description de l'image ici

kCAGravityBottomLeft

entrez la description de l'image ici

kCAGravityBottomRight

entrez la description de l'image ici

en relation

  • Propriété en mode contenu d'une vue
  • Dessiner un UIImage dans drawRect avec CGContextDrawImage
  • Didacticiel CALayer: mise en route

il doit être

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

Vous pouvez uniquement placer une CGImage dans une couche, pas directement dans une UIImage.

j'ai enlevé

  [layer setNeedsDisplay]; 

Je ne sais pas pourquoi, mais ça marche!

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

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