¿El contenido dibujado por drawRect puede animar usando la animation UIView?

En iOS, si hay dos círculos, los cuales son objects UIView , entonces su center o frame pueden animarse usando la animation UIView .

Pero la dificultad es que el contenedor UITreeView contiene estos dos círculos dibuja una línea que conecta los centros de los círculos, usando drawRect . En drawRect , podría usar CG o UIKit para dibujar la línea, y elegí utilizar UIBezierPath de moveToPoint y addLineToPoint para dibujar la línea, que en realidad debería ser llamadas de CG debajo, pero más fáciles de usar.

Pero cuando un círculo anima a la otra position, la línea no se animará con ella, por lo que la animation puede parecer un poco rara. ¿Hay alguna manera de hacerlo animar?

Intenté animar en la class TreeView en lugar de dentro de la class UINodeView (el círculo), pero eso no ayudará. De hecho, si dibujo el círculo usando un color aleatorio en su método drawRect , cuando el círculo se mueve lentamente en la animation, el color no cambiará rápidamente, lo que sugiere que no se llama a drawRect . Probablemente sea solo CALayer que mantenga una image en caching animada.

Entonces, ¿hay alguna forma de hacer que la línea también se active?

Los otros methods que puedo pensar son:

1) Utiliza un hack para usar una UIView para mantener la línea también, por lo que su marco se puede animar, pero ¿qué pasa si el círculo se mueve para que la línea necesite dibujarse dentro de la UIView de (0, 0) a (200, 200) , pero ahora la línea debe inclinarse hacia el otro lado, dibujando desde (200, 0) hasta (0, 200), así que en este caso, probablemente no funcionará. (Pero si utilizo algún tipo de transformación para voltear la image al mismo time, probablemente funcione, pero parece complicado considerar cuándo se debe usar la transformación)

2) use CADisplayLink para hacer la animation, y simplemente deje que llame [treeView setNeedsDisplay]; y en este caso, se llamará a drawRect con security. (puede ser una exageración y, dado que todo el background de TreeView se borrará por primera vez, puede que aparezca un parpadeo en la pantalla)

¿O hay una manera más simple o mejor?

Puede asignar su ruta a un CAShapeLayer (como envolverlo en una subclass UIView que devuelve CAShapeLayer como su + layerClass). La ruta se asigna a la propiedad de ruta de acceso CGPath (y tenga en count que UIBezierPath proporciona una propiedad CGPath). Luego, tienes una línea en una vista que puedes animar (como una animation grupal usando UIView + beginAnimations .