2016-09-23 11 views
0

私はこのロジックの実行を理解するのに問題があるUIViewアニメーション&です。イメージを保持するImageViewを作成しました。Tap Gesture Recognizerを追加し、UIImageViewを「User Interaction Enabled」に設定しました&そのTGRのIBActionを呼び出します。次に、画像をタップすると、以下の関数が呼び出されます。目標はパンチされたような弾力のある動きで画像を「ポップ」にし、画像の元の範囲に戻って再びパンチすることです。これは私が望むのとまったく同じです(私は通常、Durationを0.25に設定しますが、アニメーションを見やすくするためにここに10を設定します)。しかし、私は本当になぜこれが動作するのか分かりません。最後の行は、イメージの終わりの境界を元の境界のサイズ(私が望むもの)にスムーズに設定しますが、これはスムーズに行いますが、クロージャのアニメーションブロックの一部ではありません。イメージの境界をリセットする最後の行を削除すると、イメージは各実行後に各方向に60ピクセルずつ増加します(これは私が期待しているものです)。私が理解できないのは、なぜ関数の最後の行self.imageToPunch.bounds = boundsが、アニメーションブロックと一緒にスムーズに動作し、そのクロージャの内部にいなくても一見して動作するのでしょうか?UIView.animateがスムーズに動作する理由がわかりませんが、アニメーションブロックの外にコードがあります

func animateImage() { 

    // Create a variable holding the bounds of the image 
    let bounds = self.imageToPunch.bounds 

    // Setup and execute the animation 
    UIView.animate(withDuration: 10.00, delay: 0.0, usingSpringWithDamping: 0.2, initialSpringVelocity: 10, options: [], animations: { 
     self.imageToPunch.bounds = CGRect(x: bounds.origin.x - 60, y: bounds.origin.y - 60, width: bounds.size.width + 60, height: bounds.size.height + 60) 

     }, completion: nil) 

    // Reset the bounds of button so it doesn't grow (remember we spring 60 pixels from the corners) 
    // self.imageToPunch.bounds = bounds 
    self.imageToPunch.bounds = bounds 
} 
+0

はい、これは奇妙ですが、私はアニメーションが次の値を開始したときだと思いますスタックにセットされているので、アニメーションは次のアニメーションも終了しなければならないと考えます。まあ、私はそれについては分かりません。コードを理解したい場合は、最初のアニメーションが遅れて新しいUIView.animateを作成し、それを元に戻す必要があります。これはより安全で、あらゆる状況で動くでしょう。 –

答えて

0

アドバイスありがとうございました。Björn。私はあなたが提案した実装に従うかどうかはわかりませんが、それは私に何か他のものを試してもらいました。元の画像ビュー境界を縮小し、元のサイズに戻すようにアニメートすると、同じ効果が得られるように見えます。コードは以下の通りですが、私はまだ本当に元のコードがUIView.animate文の外線の影響を受けた理由を知りたいのですが:

// We'll use new constant bounds to hold the end state for the animation (imageToPunch's original bounds, or size rectangle) 
    let bounds = self.imageToPunch.bounds 

    // shrink imageToPunch by 60 
    self.imageToPunch.bounds = CGRect(x: self.imageToPunch.bounds.origin.x + 60, y: self.imageToPunch.bounds.origin.y + 60, width: self.imageToPunch.bounds.size.width - 60, height: self.imageToPunch.bounds.size.height - 60) 

    // animate image view out to the original size (saved in bounds) using a spring effect 
    UIView.animate(withDuration: 0.25, delay: 0.0, usingSpringWithDamping: 0.2, initialSpringVelocity: 10, options: [], animations: { 
     self.imageToPunch.bounds = bounds }, completion: nil) 
関連する問題