¿Es posible cancelar un UIView
animación mientras está en progreso? ¿O tendría que bajar al nivel de CA?
es decir, he hecho algo como esto (tal vez establecer una acción de animación final también):
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties
// set view properties
[UIView commitAnimations];
Pero antes de que la animación se complete y obtenga el evento de animación finalizada, quiero cancelarlo (acortarlo). es posible? Buscar en Google encuentra a algunas personas haciendo la misma pregunta sin respuestas, y una o dos personas especulando que no se puede hacer.
ios
core-animation
uiviewanimation
philsquared
fuente
fuente
Respuestas:
La forma en que lo hago es crear una nueva animación para su punto final. Establezca una duración muy corta y asegúrese de utilizar el
+setAnimationBeginsFromCurrentState:
método para comenzar desde el estado actual. Cuando lo establece en SÍ, la animación actual se acorta. Se parece a esto:fuente
setAnimationBeginsFromCurrentState:
se desaconseja el uso de iOS 4, pero todavía está allí y debería funcionar.Utilizar:
fuente
La forma más sencilla de detener todas las animaciones en una vista particular, de inmediato , es esta:
Enlace el proyecto a QuartzCore.framework. Al comienzo de su código:
Ahora, cuando desee detener todas las animaciones en una vista muerta en sus pistas, diga esto:
La línea media funcionaría por sí sola, pero hay un retraso hasta que finalice el runloop (el "momento de redibujado"). Para evitar ese retraso, envuelva el comando en un bloque de transacción explícito como se muestra. Esto funciona siempre que no se hayan realizado otros cambios en esta capa en el bucle de ejecución actual.
fuente
removeAllAnimations
tendrá el efecto secundario de llevar la animación a su cuadro final, en lugar de detenerla donde está ahora.En iOS 4 y superior, use la
UIViewAnimationOptionBeginFromCurrentState
opción en la segunda animación para acortar la primera animación.Como ejemplo, suponga que tiene una vista con un indicador de actividad. Desea desvanecerse en el indicador de actividad mientras comienza una actividad que puede llevar mucho tiempo, y desvanecerse cuando la actividad haya terminado. En el siguiente código, se llama a la vista con el indicador de actividad
activityView
.fuente
Para cancelar una animación, simplemente necesita establecer la propiedad que se está animando actualmente, fuera de la animación UIView. Eso detendrá la animación donde sea que esté, y la UIView saltará a la configuración que acaba de definir.
fuente
-animationDidStop:finished:context:
. Si[finished boolValue] == NO
, entonces sabes que tu animación fue cancelada de alguna manera.Lamento resucitar esta respuesta, pero en iOS 10 las cosas cambiaron un poco, y ahora es posible cancelar e incluso puedes cancelar con gracia.
¡Después de iOS 10, puede cancelar las animaciones con UIViewPropertyAnimator !
Si pasa verdadero, cancela la animación y se detiene justo donde la canceló. No se llamará al método de finalización. Sin embargo, si pasa falso, usted es responsable de terminar la animación:
Puede finalizar su animación y permanecer en el estado actual (.current) o ir al estado inicial (.start) o al estado final (.end)
Por cierto, incluso puedes pausar y reiniciar más tarde ...
Nota: ¡Si no desea una cancelación abrupta, puede revertir su animación o incluso cambiar su animación después de pausarla!
fuente
Si está animando una restricción cambiando la propiedad constante en lugar de una vista, ninguno de los otros métodos funciona en iOS 8.
Ejemplo de animación:
Solución:
Debe eliminar las animaciones de las capas de las vistas afectadas por el cambio de restricción y sus subcapas.
fuente
self.constraintView.layer.removeAllAnimations()
funciona (Swift)Si solo quieres pausar / detener la animación sin problemas
Fuente: Cómo pausar la animación de un árbol de capas
fuente
Ninguno de los anteriores me lo resolvió, pero esto ayudó: la
UIView
animación establece la propiedad de inmediato, luego la anima. Detiene la animación cuando la capa de presentación coincide con el modelo (la propiedad establecida).Resolví mi problema, que era "Quiero animar desde donde pareces" ("tú" significa la vista). Si quieres ESO, entonces:
CALayer * pLayer = theView.layer.presentationLayer;
establecer la posición a la capa de presentación
Yo uso algunas opciones incluyendo
UIViewAnimationOptionOverrideInheritedDuration
Pero debido a que la documentación de Apple es vaga, no sé si realmente anula las otras animaciones cuando se usa, o simplemente restablece los temporizadores.
Y esa debería ser una solución decente por ahora.
fuente
fuente
Versión rápida de la solución de Stephen Darlington
fuente
Tengo el mismo problema; las API no tienen nada para cancelar alguna animación específica. los
+ (void)setAnimationsEnabled:(BOOL)enabled
desactiva TODAS las animaciones y, por lo tanto, no funciona para mí. Hay dos soluciones:
1) convierte tu objeto animado en una subvista. Luego, cuando desee cancelar las animaciones para esa vista, elimine la vista u oculte. Muy simple, pero necesita recrear la subvista sin animaciones si necesita mantenerla a la vista.
2) repita el anim solo, y haga un selector de delegado para reiniciar el anim si es necesario, de esta manera:
El problema con 2) es que siempre hay un retraso para detener el anim cuando termina el ciclo de animación actual.
Espero que esto ayude.
fuente
Incluso si cancela la animación de la manera anterior, la animación
didStopSelector
aún se ejecuta. Entonces, si tiene estados lógicos en su aplicación impulsados por animaciones, tendrá problemas. Por esta razón, con las formas descritas anteriormente, uso la variable de contexto de lasUIView
animaciones. Si pasa el estado actual de su programa por el parámetro de contexto a la animación, cuando la animación se detiene, sudidStopSelector
función puede decidir si debe hacer algo o simplemente regresar según el estado actual y el valor de estado pasado como contexto.fuente
fuente
Para pausar una animación sin revertir el estado a original o final:
fuente
Cuando trabajo con
UIStackView
animación, ademásremoveAllAnimations()
necesito establecer algunos valores en uno inicial porqueremoveAllAnimations()
puedo establecerlos en un estado impredecible. TengostackView
conview1
yview2
dentro, y una vista debe ser visible y otra oculta:fuente
Ninguna de las soluciones respondidas funcionó para mí. Resolví mis problemas de esta manera (¿no sé si es la forma correcta?), Porque tuve problemas al llamar a esto demasiado rápido (cuando la animación anterior aún no estaba terminada). Paso mi animación deseada con el bloque customAnim .
fuente