2012-06-10 4 views
5

Estoy teniendo un mal momento tratando de obtener una imagen para mostrar en un CALayer.contents. Parece bastante sencillo pero no puedo hacer que la imagen se reproduzca sin importar lo que haga. El CALayer se ve bien ya que puedo ver el color de fondo y el radio de la esquina, pero la imagen no se cargará.Dibujar un UIImage en CALayer.contents no representa los datos de imagen

enter image description here

Lo que estamos viendo aquí es una subclase CAGradientLayer con una máscara aplicada. El cuadro interno es donde me gustaría que se muestre la imagen, y se agrega como una subcapa de la subclase CAGradientLayer.

El código para configurar esto es bastante sencillo. En init:

self.imageLayer = [CALayer layer]; 
self.imageLayer.cornerRadius = kDefaultCornerRadius; 
self.imageLayer.backgroundColor = [UIColor darkGrayColor].CGColor; 
[self addSublayer:self.imageLayer]; 

Luego, más tarde, me puse la imagen:

- (void)setImage:(UIImage *)image { 
    self.imageLayer.contents = (id)image.CGImage; 
    [self.imageLayer setNeedsDisplay]; 
} 

Por último, dentro setFrame:

CGFloat imageSize = self.bounds.size.width - 2*kDefaultMargin; 
[self.imageLayer setBounds:CGRectMake(0.0, 0.0, imageSize, imageSize)]; 
[self.imageLayer setPosition:CGPointMake(self.bounds.size.width/2.0f, kDefaultMargin + imageSize/2.0f)]; 
[self.imageLayer setNeedsDisplay]; 

cosas que ya conocen o han controladas:

  1. La capa está obv iously añadido correctamente evidente por ser visible.
  2. La imagen se agrega y funciona. [UIImage imageNamed:@"info.png"] se está utilizando en otro lugar del código y muestra e imagen. Es 16x16 a 1x y 32x32 a 2x
  3. El código se está llamando en el orden lógico correcto: init, setImage:, setFrame;

¿Qué está pasando aquí?

+0

Mismo problema y solución que en [esta pregunta] (http://stackoverflow.com/q/10060912/1218876). No llame a '[self.imageLayer setNeedsDisplay]'. –

+0

De hecho, por favor que sea una respuesta, no un comentario, así que puedo aceptarlo. – coneybeare

Respuesta

13

Poner esta línea:

[self.imageLayer setNeedsDisplay]; 

-setNeedsDisplay cuenta una capa que tiene que volver a dibujar su contenido. Como ya proporcionó el contenido para la capa, no desea que CA descarte ese contenido y solicite un reemplazo.

Cuestiones relacionadas