Animer le contenu CoreGraphics / drawRect d'UIView

Est-il possible d'animer le contenu CoreGraphics d'UIView?

Dites que j'ai une sous-class UIView appelée MyView qui implémente la méthode drawRect: comme ceci:

 - (void) drawRect: (CGRect) rect { CGContextRef c = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(c, someColor); CGContextSetLineWidth(c, someWidth); CGContextMoveToPoint(c, leftOfMyUIView, topOfMyUIView); CGContextAddLineToPoint(c, leftOfMyUIView, bottomOfMyUIView); CGContextStrokePath(c); } 

En d'autres termes – il trace une ligne verticale sur le côté gauche de ma sous-class de UIView. Existe-t-il un moyen facile d'animer cet UIView pour que la ligne se déplace du côté gauche vers le côté droit de la vue? Je voudrais qu'il «dérive» de gauche à droite.

Pour être clair – pour des raisons que je ne vais pas entrer dans je ne peux pas déplacer / animer l'instance de MyView . La meilleure solution que je puisse UIView est d'append une nouvelle sous-class UIView . Quelque chose comme LineView extends UIView et ensuite LineView les dimensions exactes de la ligne que je veux dessiner, le remplir en utilisant sa propre méthode drawRect et ensuite append une instance de LineView à MyView comme sous-vue. Cela me permettrait d'animer la position de l'object LineView utilisant un bloc d'animation, mais cela semble trop compliqué pour réaliser quelque chose d'aussi simple.

En fonction de votre commentaire selon lequel il y aura des centaines d'instances LineView, il peut être préférable d'utiliser des sous-classs CALayer par opposition aux sous-classs UIView. Les objects UIView vous permettent de gérer les events, et sur iOS chaque UIView possède un CALayer pour gérer son rendu. Si vous ne voulez pas / besoin d'un suivi d'événement pour les lignes individuelles, toutes ces instances UIView sont probablement inutiles. Vous pouvez accéder à la couche parent de UIView et append vos sous-couches de lignes si nécessaire.

Si je comprends bien votre problème, CoreGraphics ne devrait pas être nécessaire. Vous pouvez définir backgroundColor des calques de ligne pour gérer le remplissage. Ou si les lignes ne seront pas droites, vous pouvez utiliser CAShapeLayer pour rendre les paths des lignes.