agregar UIImage en CALayer

Debo agregar un UIImageView como subvista de MapView. Para hacer esto, creé una capa encima de MapView. En esta capa quiero poner mi imagen, pero obtengo un rectángulo blanco y nada más. Mi imagen no es visible

Este es el código:

- (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]; } 

Esta es una respuesta general por el bien de los futuros espectadores. Se basa en el título de la pregunta en lugar de los detalles de la pregunta original.

Cómo agregar un UIImage a un CALayer

Puede agregar una imagen a la layer una vista simplemente usando su propiedad de contents :

 myView.layer.contents = UIImage(named: "star")?.cgImage 
  • Tenga en cuenta que el UIImage debe convertirse a CGImage .

Si desea agregar la imagen en su propia capa, puede hacerlo así:

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

Modificando la apariencia

El código anterior produce una vista como esta. El azul claro es el UIView y la estrella azul oscuro es el UIImage .

enter image description here

Como puede ver, sin embargo, parece pixelado. Esto se debe a que UIImage es más pequeño que UIView por lo que se escala para llenar la vista, que es lo predeterminado, no especificas nada más.

Los siguientes ejemplos muestran variaciones en el contentsGravity la capa Propiedad contentsGravity . El código se ve así:

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

En iOS, es posible que desee establecer la propiedad isGeometryFlipped en true si está haciendo algo con gravedad superior o inferior, de lo contrario será lo contrario de lo que esperaba. (Solo la gravedad se invierte verticalmente, no la representación del contenido. Si tiene problemas con el contenido volteado, consulte esta respuesta ).

Hay dos ejemplos de UIView continuación para cada configuración de contentsGravity UIView , una vista es más grande que el UIImage y la otra es más pequeña. De esta forma puedes ver los efectos de la escala y la gravedad.

kCAGravityResize

Este es el predeterminado.

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

Relacionado

  • Propiedad de modo de contenido de una vista
  • Dibujar un UIImage en drawRect con CGContextDrawImage
  • Tutorial CALayer: Primeros pasos

tiene que ser

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

Solo puedes poner una CGImage en una capa, no un UIImage directamente.

quite

  [layer setNeedsDisplay]; 

No sé por qué, pero funciona!

Necesita establecer el marco del CALayer correctamente, porque el valor predeterminado es CGRectZero.

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