2012-06-10 18 views
5

Mam zły czas próbując uzyskać obraz, który pojawi się w CALayer.contents. Wydaje się to dość proste, ale nie mogę sprawić, by obraz był renderowany bez względu na to, co robię. Model CALayer wygląda dobrze, ponieważ widzę jego kolor tła i promień zaokrąglenia, ale obraz nie zostanie załadowany.Rysowanie UIImage w CALayer.contents nie renderuje danych obrazu

enter image description here

Co widzisz tutaj jest CAGradientLayer podklasa z maską stosowane. Wewnętrzny kwadrat to miejsce, w którym chciałbym pokazać obrazek, i jest dodawany jako podwarstwa z podklasy CAGradientLayer.

Kod do ustawienia jest dość prosty. W init:

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

potem dalej, ustawić obraz:

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

Wreszcie w 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]; 

Czego już znają lub Sprawdziłem:

  1. Warstwa jest obv juz dodany poprawnie poprawnie, ponieważ jest widoczny.
  2. Zdjęcie jest dodawane i działa. [UIImage imageNamed:@"info.png"] jest używany gdzie indziej w kodzie i faktycznie pokazuje i obraz. Jest to 16x16 przy 1x i 32x32 przy 2x
  3. Kod jest wywoływany w prawidłowej kolejności logicznej: init, setImage:, setFrame;

Co tu się dzieje?

+0

Ten sam problem i rozwiązanie, jak w [to pytanie] (http://stackoverflow.com/q/10060912/1218876). Nie wywołuj '[self.imageLayer setNeedsDisplay]'. –

+0

Rzeczywiście, proszę, zróbcie odpowiedź, a nie komentarz, abym mógł to zaakceptować. – coneybeare

Odpowiedz

13

usunąć ten wiersz:

[self.imageLayer setNeedsDisplay]; 

-setNeedsDisplay mówi warstwę, która potrzebuje odświeżenia jego zawartość. Ponieważ już podałeś treść warstwy, nie chcesz, aby CA odrzuciło tę zawartość i poprosiło o jej zastąpienie.

Powiązane problemy