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()
}