2012-06-10 7 views
5

Ich habe eine böse Zeit versucht, ein Bild zu bekommen, um in einer CALayer.contents zu zeigen. Es scheint ziemlich geradlinig, aber ich kann das Bild nicht rendern, egal was ich mache. Die CALayer wird gut wiedergegeben, da ich die Hintergrundfarbe und den Eckenradius sehen kann, aber das Bild wird nicht geladen.Zeichnen eines UIImage in CALayer.contents rendern keine Bilddaten

enter image description here

Was Sie hier sehen, ist eine CAGradientLayer Unterklasse mit einer angelegten Maske. Das innere Quadrat ist, wo ich möchte, dass das Bild angezeigt wird, und es wird als Unterschicht der Unterklasse CAGradientLayer hinzugefügt.

Der Code zum Einrichten ist ziemlich einfach. In init:

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

Dann später, habe ich das Bild:

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

Schließlich innerhalb 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]; 

Dinge, die ich bereits kennen oder haben geprüft:

  1. Die Schicht ist obv richtig hinzugefügt, da es sichtbar ist.
  2. Das Bild wird hinzugefügt und funktioniert. [UIImage imageNamed:@"info.png"] wird an anderer Stelle im Code verwendet und zeigt und zeigt das Bild. Es ist 16x16 bei 1x und 32x32 bei 2x
  3. Der Code wird in der richtigen logischen Reihenfolge aufgerufen: init, setImage:, setFrame;

Was geht hier vor?

+0

Gleiches Problem und Lösung wie in [dieser Frage] (http://stackoverflow.com/q/10060912/1218876). Rufen Sie nicht '[self.imageLayer setNeedsDisplay]' auf. –

+0

In der Tat, bitte machen Sie eine Antwort, kein Kommentar, damit ich es akzeptieren kann. – coneybeare

Antwort

13

Entfernen Sie diese Zeile:

[self.imageLayer setNeedsDisplay]; 

-setNeedsDisplay erzählt eine Schicht, die es seinen Inhalt neu zu zeichnen muss. Da Sie den Inhalt für die Ebene bereits bereitgestellt haben, möchten Sie nicht, dass CA diesen Inhalt verwirft und nach einem Ersatz fragt.