2010-07-18 6 views
2

J'ai des problèmes avec une vue d'hébergement de couches. Cette version de initWithFrame: fonctionne comme prévu (la vue est rempli noir) fournissant « Wants Core Animation couche » est sélectionnée dans Interface Builder:L'affichage de l'hébergement de couches n'affiche pas

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     [self setWantsLayer:YES]; 
     [[self layer] setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];  
     [[self layer] setContents:[NSImage imageNamed:NSImageNameBonjour]]; 
    } 
    return self; 
} 

Je veux être en mesure de configurer l'affichage par programme si je veux supprimer la confiance dans Interface Builder. Voici la deuxième version qui est destinée à atteindre cet objectif. Cela ne fonctionne pas. La vue reste la même couleur que la vue parent:

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     CALayer *rootLayer = [CALayer layer]; //Added this line, 
     [self setLayer:rootLayer]; //and this line only 
     [self setWantsLayer:YES]; 
     [[self layer] setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];  
     [[self layer] setContents:[NSImage imageNamed:NSImageNameBonjour]]; 
    } 
    return self; 
} 

Je copié le code de la documentation et cherché sur le web et tous les exemples que je trouvais fait exactement cela, mais cela ne fonctionne pas!

Qu'est-ce que je fais mal?

Répondre

1

Le problème ne concerne pas les couches, mais dans le cycle de vie des vues, les couches sont initialisées.

Si la vue est créée en code et ajoutée à une fenêtre qui a déjà été dessinée à l'écran, la méthode initWithFrame: peut être utilisée pour créer les couches. Cependant, cela ne fonctionnera pas si la vue est en cours d'initialisation à partir d'un NIB. Lors de l'initialisation à partir d'un NIB, la méthode initWithFrame: est appelée avant que la fenêtre parente ne soit complètement initialisée, ce qui entraîne l'affichage des couches. Lorsque la fenêtre est stockée dans un NIB, vous pouvez utiliser awakeFromNib au lieu de initWithFrame: pour vous assurer que les couches sont initialisées correctement.

Bien sûr, avoir deux points dans le code où les couches pourraient être créées est moche. viewDidMoveToSuperview est appelée à un point utile dans les deux cas d'utilisation ci-dessus. Les vérifications doivent être ajoutées au viewDidMoveToSuperview pour s'assurer que les couches ne sont créées qu'une seule fois.

(note mentale - Si quelque chose n'a pas de sens et vous vous sentez que vous devez poser sur le débordement de pile, il est un bon signe que vous avez besoin de sommeil.)

0

Pouvez-vous essayer d'appeler ce qui suit dans initWithFrame?

[layer setFrame:[self bounds]];