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];
}
J'ai enlevé
[layer setNeedsDisplay];
Je ne sais pas pourquoi, mais ça marche!
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.
Vous pouvez ajouter une image au layer
d'une vue simplement en utilisant sa propriété contents
:
myView.layer.contents = UIImage(named: "star")?.cgImage
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)
Le code ci-dessus produit une vue comme celle-ci. Le bleu clair est le UIView
et l'étoile bleu foncé est le UIImage
.
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.
kCAGravityResizeAspect
kCAGravityResizeAspectFill
kCAGravityCenter
kCAGravityTop
kCAGravityBottom
kCAGravityLeft
kCAGravityRight
kCAGravityTopLeft
kCAGravityTopRight
kCAGravityBottomLeft
kCAGravityBottomRight
ça doit être
layer.contents = (id)[UIImage imageNamed:@"myImage.png"].CGImage;
Vous pouvez uniquement placer un CGImage dans un calque, pas directement un UIImage.
Vous devez définir correctement le cadre de CALayer, car la valeur par défaut est CGRectZero.
myView.layer.contents = UIImage (nommé: "star") ?. cgImage