No he usado mucho UIViewPropertyAnimator (todavía soy un chico de bloques anticuado) y estoy viendo un comportamiento que no puedo explicar y que los documentos realmente no brindan ninguna información.
¿Por qué se llama al bloque de finalización de un animador con una posición final de finalPosition incluso cuando el animador se .end inmediatamente después de que se inicia?
let view = UIView() let animator = UIViewPropertyAnimator(duration: 4, curve: .linear, animations: { view.alpha = 0 }) animator.addCompletion { position in print("done") switch position { case .start: print("start") case .current: print("current") case .end: print("end") } } animator.startAnimation() print("starting") animator.pauseAnimation() print("pausing")Producción:
starting pausing done endEl problema, como aludió @matt, es que su vista no está en una UIWindow visible, por lo que las animaciones se completan de inmediato. Obtiene el mismo resultado si comenta la instrucción animator.pauseAnimation() .
Puede solucionar esto si está utilizando un patio de recreo haciendo view la vista en liveView de la página del patio de recreo:
import PlaygroundSupport import UIKit let view = UIView() PlaygroundPage.current.liveView = view // etc.Si lee la documentación de addCompletion del sitio para desarrolladores de Apple, uno de los parámetros es finalPosition. Y puede usar el valor para determinar si la animación se detuvo al principio, al final o en algún punto intermedio. Y llamar a pauseAnimation activará ese bloque de finalización con un lugar en la posición intermedia.
Parámetros finalización Un bloque para ejecutar cuando finalicen las animaciones. Este bloque no tiene valor de retorno y toma el siguiente parámetro:
finalPosition La posición final de las animaciones. Utilice este valor para determinar si las animaciones se detuvieron al principio, al final o en algún punto intermedio.