2015-01-10 11 views
23

Ich versuche, eine UIImageView zu animieren und dann die Bildansicht zu verbergen, nachdem die Animation abgeschlossen ist. Die Bildansicht wird jedoch ausgeblendet, bevor die Animation abgeschlossen ist. Ich habe mir ähnliche Fragen angesehen und empfehle, einen Animations-Listener zu implementieren oder den .hidden-Code innerhalb des Animations-Codes nach der Fertigstellung auszuführen, aber ich bin mir nicht sicher, wie ich dies innerhalb der folgenden shakeView() - Funktion beeinflussen kann.Warten Sie, bis die schnelle Animation abgeschlossen ist, bevor Sie den Code ausführen

Wie kann ich die Shake-Animation anzeigen und die Bildansicht nur ausblenden, nachdem die Animation abgeschlossen ist?

Animation, wird mit dem folgenden Code aufgerufen:

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

Die Animation Funktion selbst sieht wie folgt aus:

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") 
} 
+0

See in https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html#//apple_ref/doc/ "das Ende einer Animation Erkennung" uid/TP40004514-CH3-SW1 – Paulw11

Antwort

53

Sie einen CATransaction können einen Abschluss Block zu rufen, nachdem die Animation abgeschlossen ist.

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

Oder Sie können auch beide Animationen zusammen in einem CATransaction wie folgt gruppieren.

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

zu entsprechen Die erste Implementierung funktionierte perfekt. Ich habe UIImageView durch eine UIButton ersetzt und der Code funktionierte ohne Probleme. Vielen Dank! – zeeshan

13

Als Paulw11 in seinem Kommentar erwähnt, können Sie die animationDidStop: Methode erwähnt verwenden die Dokumente. Darüber hinaus sollten Sie einen Schlüssel zu Ihnen CABasicAnimation/CAAnimation Objekte hinzufügen, so dass Ihre animationDidStop: Methode weiß, welche speziell abgeschlossen hat.

Also in Ihrer Shake-Methode ein Wert-Schlüsselpaar hinzufügen um die Animation zu identifizieren und die Delegierten selbst gesetzt, ex:

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 

    // ... 

dann die animationDidStop: Delegierten fügen Methode, die Sie zu warnen, wenn die Animation vollständig, so können Sie beginnen, Ihren Code ausführen:

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 
     } 
    } 
} 
+0

Gut zu wissen, wird die Implementierung hinzufügen, danke. – zeeshan

+1

War nach genau diesem Beispiel gesucht. Vielen Dank! – OpherV

+1

Vergessen Sie nicht, das CAAnimationDelegate in Ihrem ViewController –

Verwandte Themen