ios objective-c core-animation uiviewanimation completion-block

ios - Detenga una animación UIView con inversión automática/repetición infinita con un bloque de finalización/BOOL



objective-c core-animation (4)

Estoy configurando el siguiente método UIView animateWithDuration: con la intención de configurar mi animationOn BOOL en otra parte del programa para cancelar esa repetición de bucle infinito. Tenía la impresión de que el bloque de completion se llamaría cada vez que completion un ciclo de la animación, pero este no parece ser el caso.

¿Se llama alguna vez al bloque de completion en una animación repetida? Y si no, ¿hay otra forma en que pueda detener esta animación desde fuera de este método?

- (void) animateFirst: (UIButton *) button { button.transform = CGAffineTransformMakeScale(1.1, 1.1); [UIView animateWithDuration: 0.4 delay: 0.0 options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat animations: ^{ button.transform = CGAffineTransformIdentity; } completion: ^(BOOL finished){ if (!animationOn) { [UIView setAnimationRepeatCount: 0]; } }]; }


El bloque de finalización solo se llamará cuando se interrumpa la animación. Por ejemplo, se llama cuando la aplicación se pone en segundo plano y vuelve al primer plano de nuevo (a través de la multitarea). En ese caso la animación se detiene. Debes reiniciar la animación cuando eso suceda.

Para detener la animación, puede eliminarla de la capa de la vista:

[button.layer removeAllAnimations];


Según la documentación de Ver referencia de clase: Si usó alguno de los métodos de clase como animateWithDuration:delay:options:animations:completion: si la duración se establece en un valor negativo o 0, los cambios se realizan sin realizar la animación. Así que hice algo como esto para detener la animación infinita:

[UIView animateWithDuration:0.0 animations:^{ button.layer.affineTransform = CGAffineTransformIdentity; }];

Creo que esto es mejor que eliminar todas las animaciones de la capa como en la respuesta sugerida. Tenga en cuenta que esto es aplicable para todos los demás métodos de animación de clase en la clase UIView.


Vieja pero otra opción.

También puede configurar otra animación que no se repita en la misma vista, de esa manera también puede capturarla en el estado actual y devolverla a su estado actual mediante la opción UIViewAnimationOptionBeginFromCurrentState. Su bloque de finalización también se llama.

-(void)someEventSoStop { button.transform = CGAffineTransformMakeScale(1.0, 1.0); [UIView animateWithDuration: 0.4 delay: 0.0 options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState animations: ^{ button.transform = CGAffineTransformIdentity; } completion: ^(BOOL finished){ }]; }


[button.layer removeAllAnimations] el problema llamando a [button.layer removeAllAnimations] .