Prueba si UIView está en el medio de la animación

¿Hay alguna forma de saber si un UIView está en el medio de una animación? Cuando imprimo el objeto de vista mientras se mueve, noto que hay una entrada de “animaciones”:

search bar should end editing: <UISearchBar: 0x2e6240; frame = (0 0; 320 88); text = ''; autoresize = W+BM; animations = { position=; bounds=; }; layer = > 

Cuando la animación se detuvo e imprimo la vista, la entrada de “animaciones” ya no está:

 search bar should end editing: <UISearchBar: 0x2e6240; frame = (0 0; 320 88); text = ''; autoresize = W+BM; layer = > 

Un UIView tiene una capa ( CALayer ). Puede enviarle animaciones , que le proporcionarán una serie de claves que identifican las animaciones asociadas a la capa. Supongo que si hay entradas, las animaciones se están ejecutando. Si quieres profundizar aún más, echa un vistazo al protocolo CAMediaTiming que adopta CALayer. Hace más información sobre la animación actual.

Las animaciones se adjuntan de hecho a la clase subyacente CALayer Animación CALayer

Así que creo que solo puedes verificar myView.layer.animationKeys

No estoy seguro del contexto de la pregunta pero estaba tratando de averiguar si una vista estaba animando antes de comenzar una segunda animación para evitar saltar. Sin embargo, hay una opción de animación UIViewAnimationOptionBeginFromCurrentState que combinará las animaciones si es necesario para dar una apariencia suave. Por lo tanto, eliminando mi necesidad de saber si la vista estaba animando.

Hay un problema con el truco de animationKeys.

A veces puede haber algunas teclas animadas persistentes después de que se completa una animación.

Esto significa que una capa no animada podría devolver un conjunto de animaciones, incluso si no está realmente animando.

Puede asegurarse de que animationKeys se eliminen automáticamente estableciendo la propiedad removedOnCompletion de una animación en YES.

p.ej

 CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"aPath"]; animation.removedOnCompletion = YES; 

Si hace esto para todas las animaciones que aplica a su capa, se asegurará de que cuando la capa no esté animando no haya animaciones presentes.

Algunos de estos no funcionaron para mí. El motivo es que estas animaciones son asincrónicas.

Lo que hice fue definido una propiedad

 @property BOOL viewIsAnimating; 

Y en mi animación

 [UIView animateWithDuration:0.25 animations:^{ viewIsAnimating = YES; } completion:^(BOOL finished) { if (finished) { viewIsAnimating = NO; } }]; 

El método iOS 9+ , funciona incluso cuando layer.animationKeys no contiene claves:

 let isInTheMiddleOfAnimation = UIView.inheritedAnimationDuration > 0 

De los documentos:

Este método solo devuelve un valor distinto de cero si se llama dentro de un bloque de animación UIView.

Ref a la pregunta: Posición central de UIView durante la animación

Comparo el marco de la vista y el marco de layer.presentation () ?. para comprobar que está animando. Si leftView está en camino de finalizar, el marco leftView.layer.presentation () ?. no es igual a su fotogtwig:

 if self.leftView.layer.presentation()?.frame == self.leftView.frame { // the animation finished } else { // the animation on the way } 

Pero este método puede no funcionar si la vista se mueve a la posición final durante la animación. Puede ser necesario un control de estado más.

Puede consultar la capa de presentación como se sugiere aquí. Mi capa de presentación no coincide con la capa de mi modelo aunque no tenga animaciones.