2012-06-10 9 views
5

Sto provando un po 'di tempo per far visualizzare un'immagine in uno CALayer.contents. Sembra piuttosto semplice, ma non riesco a ottenere l'immagine da renderizzare, non importa quello che faccio. Il CALayer viene visualizzato correttamente in quanto posso vedere il suo colore di sfondo e il raggio dell'angolo, ma l'immagine non verrà caricata.Disegnare un oggetto UII in CALayer.contents non esegue il rendering dei dati di immagine

enter image description here

Quello che state vedendo qui è una sottoclasse CAGradientLayer con una maschera applicata. Il quadrato interno è il punto in cui vorrei che l'immagine venga mostrata e viene aggiunto come sottolivello della sottoclasse CAGradientLayer.

Il codice per impostare questo è piuttosto semplice. In init:

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

poi in seguito, ho impostato l'immagine:

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

Infine, entro 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]; 

Le cose che già conoscono o hanno controllato:

  1. Il livello è obv è stato aggiunto correttamente in quanto visibile.
  2. L'immagine è stata aggiunta e funziona. [UIImage imageNamed:@"info.png"] viene utilizzato altrove nel codice e in realtà mostra e immagine. È 16x16 a 1x e 32x32 a 2x
  3. Il codice viene chiamato nell'ordine logico corretto: init, setImage:, setFrame;

Cosa sta succedendo qui?

+0

Stessi problemi e soluzioni come in [questa domanda] (http://stackoverflow.com/q/10060912/1218876). Non chiamare '[self.imageLayer setNeedsDisplay]'. –

+0

In effetti, per favore, fai una risposta, non un commento, quindi posso accettarlo. – coneybeare

risposta

13

Inserisci questa linea:

[self.imageLayer setNeedsDisplay]; 

-setNeedsDisplay dice uno strato che ha bisogno di ridisegnare il suo contenuto. Poiché hai già fornito il contenuto per il livello, non vuoi che la CA scarti quel contenuto e chieda una sostituzione.

Problemi correlati