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