iOS: múltiples bloques de animation?

Tengo varias animaciones que tienen que ejecutarse como una cadena. La forma en que he estado tratando con esto es usar un completador Handler y ejecutar el siguiente bloque de animation. ¿Hay una manera más limpia de lidiar con esto?

[UIView animateWithDuration:1 animations^{ // perform first animation }completion:(BOOL finished){ [UIView animateWithDuration:1 animations^{ // perform second animation }completion:(BOOL finished){ }]; }]; 

También puede usar animateWithDuration:delay:options:animations:completion: con retrasos escalonados para que comiencen en order, pero normalmente es mejor hacerlo con bloques de finalización.

Si hay varios y hace que el código sea difícil de leer, simplemente factoriza los bloques (estoy escribiendo esto en lo alto de mi cabeza, por lo que puede no comstackr):

 typedef void (^AnimationBlock)(); AnimationBlock firstAnimation = ^{ ... }; AnimationBlock secondAnimation = ^{ ... }; [UIView animateWithDuration:1 animations:firstAnimation completion:(BOOL finished) { [UIView animateWithDuration:1 animations:secondAnimation];}]; 

Podrías crear una categoría en UIView que tomó una variedad de tales bloques y los encadenó para ti, pero luego tendrás que lidiar con todos los casos de esquina. ¿Cómo defines los times; ¿Cómo lidias con animaciones abortadas, etc. Lo anterior es probablemente el mejor enfoque en la mayoría de los casos.

Escribí una publicación de blog sobre esto. Mi enfoque es crear un object de animation que encapsule el bloque y otras properties de animation. A continuación, puede pasar una matriz de dichos objects a otro object de animation que los ejecutará en secuencia. El código está disponible en GitHub .