2015-01-10 22 views
23

UIImageViewをアニメーション化してから、アニメーションが完了した後でイメージビューを非表示にしようとしています。しかし、アニメーションが完了する前にイメージビューが非表示になります。私は同様の質問を見て、アニメーションリスナーを実装するか、完了時にアニメーションコード内で.hiddenコードを実行することをお勧めしますが、私は以下のshakeView()関数内でこれにどのように影響するかはわかりません。コードを実行する前にスウィフトアニメーションが完了するのを待ちます。

アニメーションが完了した後で、シェイクアニメーションを表示してイメージビューを非表示にするにはどうすればよいですか?

アニメーションは、次のコードを使用して呼び出されます。

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

アニメーション機能自体は次のようになります。

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

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html#//apple_ref/doc/で「アニメーションの終了を検出する」を参照してください。 uid/TP40004514-CH3-SW1 – Paulw11

答えて

53

あなたはアニメーションが完了した後に完了ブロックを呼び出すためにCATransactionを使用することができますので、あなたのコードの実行を開始することができます完了します。

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

また、CATransactionで両方のアニメーションをグループ化することもできます。

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

最初の実装は完全に機能しました。私はUIImageViewをUIButtonに置き換え、コードは問題なく動作しました。ありがとう! – zeeshan

13

Paulw11が彼のコメントで示唆したように、あなたが言及したanimationDidStop:方法を使用することができますドキュメント。さらに、CABasicAnimation/CAAnimationオブジェクトにキーを追加すると、animationDidStop:メソッドがどれが完了したかを知ることができます。あなたの手ぶれ方法でそう

、アニメーションを識別し、自己へのデリゲートを設定するために元の値がキーのペアを追加します。

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 

    // ... 

その後アニメーションがあるときにとしてあなたを警告するanimationDidStop:デリゲートメソッドを追加

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

知っておいてよかったです、実装に、ありがとうございました。 – zeeshan

+1

この正確な例を検索していました。ありがとう! – OpherV

+1

あなたのviewControllerにCAAnimationDelegateを準拠させることを忘れないでください。 –

関連する問題