2010-07-29 5 views
5

J'ai une application avec une sous-classe CALayer personnalisée. Dans cette sous-classe de couche j'ai remplacé la méthode - (void) drawInContext:(CGContextRef)ctx. Cela fonctionne bien et tout mon contenu personnalisé est dessiné.CALayer ne dessine pas son contenu lorsque CABasicAnimation est utilisé

Maintenant, je voulais ajouter une propriété personnalisée qui s'anime quand il est contenu est modifié. Et j'ai besoin de redessiner pendant que l'animation fonctionne. J'ai ajouté la propriété comme donnée dans la réponse à la question suivante: Animating a custom property of CALayer subclass

Et j'ai aussi ajouté une instance CABasicAnimation de cette propriété à ma couche:

CABasicAnimation* theAnimation=[CABasicAnimation animationWithKeyPath:@"moveContentToLeft"]; 
theAnimation.duration=1.0; 
theAnimation.fromValue=[NSNumber numberWithFloat:0.0]; 
theAnimation.toValue=[NSNumber numberWithFloat:10.0]; 
[area addAnimation:theAnimation forKey:@"moveContentToLeft"]; 

Dans ma méthode de tirage au sort, j'ai une déclaration NSLog dans dont je publie la valeur de ma propriété, je l'anime.

Mon problème est que dès que l'animation commence tout le contenu de la sous-classe de la couche est effacée. Le NSLog affiche les valeurs de ma propriété qui est interpolée (ainsi la méthode drawInContext) est appelée. Mais d'une manière ou d'une autre les choses qu'il dessine ne sont pas visibles pendant l'animation. À la fin de l'animation, le contenu original redevient visible.

Pour l'instant, la propriété animée n'est pas encore utilisée lors du dessin de la couche, donc je m'attendrais à ce que le contenu normal soit à nouveau tracé et j'obtiens la sortie du NSLog avec les valeurs interpolées.

Ma couche est un enfant d'une autre couche (à l'intérieur d'un UIView). J'ai essayé de redessiner la super couche à la fin de la méthode de dessin (en appelant _parent setNeedsDisplay [parent est un ivar à la vue parente]). Cela n'a pas aidé. Et j'ai aussi le sentiment que ce n'est pas une bonne idée de le faire.

J'espère que quelqu'un peut m'aider avec ce problème.

Mise à jour

Merci au projet par exemple de Matt long je pouvais voir que mon problème réside dans la méthode de dessin. J'ai étendu son projet afin qu'il montre le même problème. Je pense qu'il est plus simple de montrer que le code d'origine;)

- (void)drawInContext:(CGContextRef)ctx 
{ 
    NSLog(@"Getting called: Bob: %i", [self bob]); 

    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathAddRect(path, NULL, CGRectMake(50 + [self bob], 50, 100, 100)); 
    CGContextAddPath(ctx, path); 
    CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor); 
    CGContextSetLineWidth(ctx, 1.0); 
    CGContextStrokePath(ctx); 
    CGPathRelease(path); 

    [_test testInContext:ctx]; // here is the problem 
} 

Le Ivar _test est une classe personnalisée qui contient un code de dessin (au moment où il tire une boîte verte). Le problème est maintenant que cette boîte verte ne sera pas dessinée pendant l'exécution de l'animation. Dès que l'animation est terminée, la boîte verte est à nouveau visible. Le projet exemple étendu: http://dl.dropbox.com/u/5426092/ArbitraryPropertyAnimationNew.zip

+0

Je pense que cela pourrait aider à montrer le code de dessin en plus du code d'animation. Il ne semble pas y avoir de problème avec le code d'animation. –

+0

Cette question était une réponse à ma question, je vous remercie,.) –

+0

je même problème, je l'ai réparée [ici] (http://stackoverflow.com/questions/42942414/cashapelayer-custom-property-is-nil -when-drawincontext) –

Répondre

1

Il est difficile de dire ce qui ne va pas sans voir plus de code. J'ai un exemple d'application qui anime une propriété personnalisée et la position d'une couche en même temps. Vous pouvez take a look at my source et voir ce qui est différent.

+0

Merci pour votre exemple de code. Je l'ai étendu afin qu'il se comporte comme mon code (voir ma question). – Chris

+0

La vraie question à ce stade est ce que vous essayez de faire? J'ai regardé vos changements de code, mais je ne peux pas comprendre pour la vie de moi ce que vous voulez qu'il fasse. Si vous essayez simplement d'animer quelques rectangles, il n'y a absolument aucune raison de le dessiner vous-même. Vous devriez simplement ajouter vos deux rectangles en tant que calques et animer leurs positions comme mon exemple de code l'a montré.Votre propriété personnalisée est complètement inutile. Alors qu'essayez-vous de faire à nouveau? –

Questions connexes