preferslargetitles prefer large bar ios animation swift

ios - prefer - swift large navigation bar



Espere a que la animación Swift se complete antes de ejecutar el código (2)

Como Paulw11 aludió en su comentario, puede usar el método animationDidStop: mencionado en los documentos. Pero, además, debe agregar una clave a CABasicAnimation/CAAnimation objetos de CABasicAnimation/CAAnimation para que su método animationDidStop: sepa cuál ha completado en particular.

Entonces, en su método shake, agregue un par value-key para identificar la animación y establecer el delegado en self, por ejemplo:

func shakeView(iv: UIImageView){ var shake:CABasicAnimation = CABasicAnimation(keyPath: "position") shake.duration = 0.1 shake.repeatCount = 2 shake.autoreverses = true // Add these two lines: shake.setValue("shake", forKey: "animationID") shake.delegate = self // ...

A continuación, agregue el método animationDidStop: delegate para alertarlo cuando la animación se complete para que pueda comenzar a ejecutar su código:

override func animationDidStop(anim: CAAnimation!, finished flag: Bool) { // Unwrap the optional value for the key "animationID" then // if it''s equal to the same value as the relevant animation, // execute the relevant code if let animationID: AnyObject = anim.valueForKey("animationID") { if animationID as NSString == "shake" { // execute code } } }

Intento animar un UIImageView y luego ocultar la vista de la imagen una vez completada la animación. Sin embargo, la vista de la imagen se oculta antes de que se complete la animación. Miré preguntas similares y me recomiendan implementar un oyente de animación o ejecutar el código .hidden dentro del código de animación al finalizar, sin embargo, no estoy seguro de cómo afectar esto dentro de la función shakeView () a continuación.

¿Cómo se muestra la animación de batido y se oculta la vista de imagen solo después de que se completa la animación?

La animación se llama usando el siguiente código:

shakeView(image1!) shakeView(image2) image1!.hidden = true image2.hidden = true

La función de animación en sí se ve así:

func shakeView(iv: UIImageView){ var shake:CABasicAnimation = CABasicAnimation(keyPath: "position") shake.duration = 0.1 shake.repeatCount = 2 shake.autoreverses = true var from_point:CGPoint = CGPointMake(iv.center.x - 5, iv.center.y) var from_value:NSValue = NSValue(CGPoint: from_point) var to_point:CGPoint = CGPointMake(iv.center.x + 5, iv.center.y) var to_value:NSValue = NSValue(CGPoint: to_point) shake.fromValue = from_value shake.toValue = to_value iv.layer.addAnimation(shake, forKey: "position") }


Puede usar una CATransaction para llamar a un bloque de finalización después de que finalice la animación.

func shakeView(iv: UIImageView){ CATransaction.begin() CATransaction.setCompletionBlock({ iv.hidden = true }) var shake:CABasicAnimation = CABasicAnimation(keyPath: "position") shake.duration = 0.1 shake.repeatCount = 21 shake.autoreverses = true var from_point:CGPoint = CGPointMake(iv.center.x - 5, iv.center.y) var from_value:NSValue = NSValue(CGPoint: from_point) var to_point:CGPoint = CGPointMake(iv.center.x + 5, iv.center.y) var to_value:NSValue = NSValue(CGPoint: to_point) shake.fromValue = from_value shake.toValue = to_value iv.layer.addAnimation(shake, forKey: "position") CATransaction.commit() }

O también puede agrupar ambas animaciones en una CATransaction siguiente manera.

func shakeView(iv: UIImageView){ var shake:CABasicAnimation = CABasicAnimation(keyPath: "position") shake.duration = 0.1 shake.repeatCount = 21 shake.autoreverses = true var from_point:CGPoint = CGPointMake(iv.center.x - 5, iv.center.y) var from_value:NSValue = NSValue(CGPoint: from_point) var to_point:CGPoint = CGPointMake(iv.center.x + 5, iv.center.y) var to_value:NSValue = NSValue(CGPoint: to_point) shake.fromValue = from_value shake.toValue = to_value iv.layer.addAnimation(shake, forKey: "position") } override func viewDidLoad() { CATransaction.begin() CATransaction.setCompletionBlock({ self.image1.hidden = true self.image2.hidden = true }) shakeView(image1) shakeView(image) CATransaction.commit() }