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
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. –
Cette question était une réponse à ma question, je vous remercie,.) –
je même problème, je l'ai réparée [ici] (http://stackoverflow.com/questions/42942414/cashapelayer-custom-property-is-nil -when-drawincontext) –