2010-06-27 3 views
2

Cela peut être mon manque de compréhension de la pile d'appels lors de l'utilisation de Core Animation, mais quelque chose me perturbe un peu à propos de qui/appelle drawInContext.L'appel de CABasicAnimation à drawInContext provoque la remise à zéro des variables d'instance

Disons que je

@interface PlayerLayer : CALayer 
{ 
    int Foo; 
} 

et j'initialiser Foo init pour être quelque chose comme

-(void) init 
{ 
    if(self = [super init]) 
    { 
    Foo = 123; 
    } 
} 

Lorsque drawInContext est d'abord appelé, j'imprimer Foo

- (void)drawInContext:(CGContextRef)ctx 
{ 
    NSLog(@"Foo: %d", Foo) 
} 

Le La première fois que 'drawInContext' est appelé lorsque la couche est ajoutée et que setNeedsDisplay déclenche l'appel, Foo = 123 devrait.

J'ai une animation configurée pour une clé de propriété appelée "Bar" par exemple, dans laquelle 'needsDisplayForKey' renvoie YES pour la clé "Bar". Lorsque cette animation déclenche «drawInContext», toutes les variables d'instance sont définies sur 0 et, en tant que telles, Foo s'imprime en tant que 0. La valeur du pointeur «self» a également changé. Quelqu'un peut-il faire la lumière sur pourquoi DrawInContext semble être appelé à partir d'un autre endroit magique, et non pas à partir de l'instance de la couche que je m'attends à ce qu'il soit?

Cela signifie que toutes les variables d'état que j'ai stockées dans l'instance ne peuvent pas être utilisés :-(

Répondre

1

Quand vous faites une animation, Core Animation fait une copie de la couche et assignez est tout à la propriété presentationLayer de la couche. La L'animation est alors exécutée sur la couche de présentation AFAIK seules les propriétés sont copiées, pas les ivars Essayez de déclarer Foo comme une propriété et voyez si cela aide

+0

Merci Ole, je pensais que c'était peut-être le cas alors j'ai essayé. Savez-vous dans la documentation que je pourrais trouver des informations sur le processus de copie? Ou, avez-vous un ide un sur la façon d'accéder à ces données à partir d'une animation? – Fuzz

+1

Vous avez raison, sauf que les propriétés ne semblent pas être copiées automatiquement. Au lieu de cela, l'utilisateur peut remplacer initWithLayer et forcer la copie des propriétés personnalisées. Voir: http://stackoverflow.com/questions/2797103/how-is-la-presentation-layer-of-a-calayer-generated – Fuzz

Questions connexes