xyz-log.
トップへ戻る
Tech / 2026.01.08 2026.01.08 / 4 分 ...

完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)

S7r1n9y

S7r1n9y

Engineer

完全に理解する Storyboard & UIKit
20 / 30
このシリーズの記事一覧
  1. 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
  2. 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
  3. 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
  4. 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
  5. 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
  6. 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
  7. 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
  8. 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
  9. 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
  10. 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
  11. 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
  12. 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
  13. 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
  14. 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
  15. 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
  16. 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
  17. 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
  18. 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
  19. 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
  20. 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
  21. 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
  22. 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
  23. 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
  24. 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
  25. 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
  26. 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
  27. 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
  28. 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
  29. 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
  30. 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる
完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)

Sponsored

完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)

ボタンを押したときの沈み込み、画面遷移時の滑らかなフェードイン、バナーが上からスッと降りてくる表現... 優れたiOSアプリには必ず「心地よいアニメーション(モーション)」が組み込まれています。

UIKitは、複雑なアニメーション計算をたった数行で書ける強力なAPI (UIView Animation block) を提供しています。


1. UIView アニメーションの基本構造

アニメーションさせたいプロパティ(位置、サイズ、透明度など)の変更を、UIView.animate というメソッドのブロック(クロージャ)の中で行うだけで、システムが現在の状態から次の状態へと自動的に補間し、アニメーションとして描画してくれます。

最もシンプルなフェードイン

あるView(myBox)の透明度(alpha)を0から1へ、1秒かけてアニメーションさせるコードです。

swift
// 初期状態では透明にしておく myBox.alpha = 0.0 // 1.0秒かけてアニメーションを実行 UIView.animate(withDuration: 1.0) { // 最終的にどうなってほしいかの状態を書く self.myBox.alpha = 1.0 }

💡 アニメーション可能なプロパティ 全てのプロパティがアニメーションするわけではありません(Textなどは不可)。主に以下のプロパティが対象です。

  • frame / bounds (サイズと位置)
  • center (中心位置)
  • transform (回転、拡大縮小)
  • alpha (透明度)
  • backgroundColor (背景色)

2. アニメーションのオプション(Options)

animate(withDuration:delay:options:animations:completion:) というフル引数のメソッドを使うと、より細かな制御が可能です。

  • delay: アニメーションが始まるまでの遅延時間(秒)。
  • options: 動きのカーブ(イージング)や繰り返しなどを指定。
  • completion: アニメーション要素が完了した後に実行したい処理を書くブロック。
swift
// ボタンが押された時の処理 @IBAction func moveButtonTapped(_ sender: UIButton) { UIView.animate(withDuration: 0.5, delay: 0.0, // easeInOut: 最初と最後がゆっくりになる自然な動き options: [.curveEaseInOut], animations: { // myBoxを右に100ピクセル移動させる self.myBox.frame.origin.x += 100 // 同時に背景色を赤に変更する self.myBox.backgroundColor = .systemRed }, completion: { (finished) in // アニメーション完了後に呼ばれる print("移動完了!") }) }

3. Spring効果(バネのような弾力感)

iOSのデザイン言語全体で多用されているのが、物理的な「バネ」の挙動を模した スプリング・アニメーション です。 少し飛び出してからビヨーンと戻るような、心地よい弾力性を表現します。

animate(withDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:) を使います。

swift
UIView.animate(withDuration: 0.8, delay: 0, // Damping (0.0〜1.0): バネの減衰力。1に近いほど硬く跳ねない。0.5くらいがぽよんとする。 usingSpringWithDamping: 0.5, // Velocity: 初速。ゼロでOK。 initialSpringVelocity: 0.0, options: [], animations: { // 要素を1.5倍に拡大する(transformを利用) self.myBox.transform = CGAffineTransform(scaleX: 1.5, y: 1.5) }, completion: nil)

4. Auto Layout下でのアニメーションの注意点

Day 4で学んだAuto Layoutを用いてレイアウトを構築している場合、要素の frame(座標)を直接書き換えてアニメーションさせると、後でシステムがAuto Layoutの再計算を行った時に元の位置に戻ってしまうバグが発生します。

Auto Layoutを使っている場合は、「位置(frame)そのものではなく、Constraint(制約の設定値)をアニメーションさせる」 のが鉄則です。

  1. 動かしたい制約(例: Top Constraint)を Storyboardから IBOutlet として繋ぐ。
  2. コード内でその constant(定数)の値を変更する。
  3. UIView.animate のブロック内で self.view.layoutIfNeeded() を呼び出す。
swift
@IBOutlet weak var topConstraint: NSLayoutConstraint! // ... // 1. 制約の目標値を変更する topConstraint.constant = 200 // 2. 変更された制約に従って、レイアウトの再計算をアニメーションと共に行う UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() }

📝 今日のまとめ

  • アニメーションは UIView.animate(withDuration:animations:) というクロージャ内に「最終状態」を書くだけで実行される。
  • Transformプロパティをいじることで、回転や拡大縮小(ポップアップ効果など)が簡単に実装できる。
  • iOSらしい自然な動きを作りたいときは、バネの挙動を持った スプリング・アニメーション を使う。
  • Auto Layout適用時は、frameを変更するのではなく、制約(constant)を変更し layoutIfNeeded() をアニメーションブロック内で呼ぶ。

アプリが生き生きと動き出しました。 明日の Day 21 では、ユーザーの細かな指の動き(スワイプ、ピンチ、長押し等)を検知し、インタラクティブに応答するための仕組み、UIGestureRecognizer について学びます。

END OF FILE
この記事は役に立ちましたか?
SNSでシェアする
後で読む(ブックマーク)
完全に理解する Storyboard & UIKit
20 / 30
このシリーズの記事一覧
  1. 1. 完全に理解する Storyboard & UIKit (Day 1): 基礎概念と歴史
  2. 2. 完全に理解する Storyboard & UIKit (Day 2): XcodeでのStoryboardの基本操作
  3. 3. 完全に理解する Storyboard & UIKit (Day 3): UIViewControllerのライフサイクル
  4. 4. 完全に理解する Storyboard & UIKit (Day 4): Auto Layoutの基本原理
  5. 5. 完全に理解する Storyboard & UIKit (Day 5): Auto Layoutの複雑な制約の解決
  6. 6. 完全に理解する Storyboard & UIKit (Day 6): UIStackViewを使った効率的なレイアウト設計
  7. 7. 完全に理解する Storyboard & UIKit (Day 7): Size Classesによるレスポンシブデザイン
  8. 8. 完全に理解する Storyboard & UIKit (Day 8): Segueによる画面遷移とデータ渡し
  9. 9. 完全に理解する Storyboard & UIKit (Day 9): Navigation Controllerの活用
  10. 10. 完全に理解する Storyboard & UIKit (Day 10): Tab Bar Controllerの活用
  11. 11. 完全に理解する Storyboard & UIKit (Day 11): 基本的なUI部品(UILabel, UIButton, UITextField)
  12. 12. 完全に理解する Storyboard & UIKit (Day 12): UITextViewとキーボードハンドリング
  13. 13. 完全に理解する Storyboard & UIKit (Day 13): UIImageViewと画像リソース管理
  14. 14. 完全に理解する Storyboard & UIKit (Day 14): UIScrollViewとコンテンツのスクロール
  15. 15. 完全に理解する Storyboard & UIKit (Day 15): UITableViewの実装基礎
  16. 16. 完全に理解する Storyboard & UIKit (Day 16): UITableViewのカスタムセル作成
  17. 17. 完全に理解する Storyboard & UIKit (Day 17): UICollectionViewの実装基礎
  18. 18. 完全に理解する Storyboard & UIKit (Day 18): UICollectionViewのカスタムレイアウト
  19. 19. 完全に理解する Storyboard & UIKit (Day 19): Custom Viewの作成とStoryboardでの利用(@IBDesignable, @IBInspectable)
  20. 20. 完全に理解する Storyboard & UIKit (Day 20): アニメーションの実装(UIView Animation)
  21. 21. 完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理
  22. 22. 完全に理解する Storyboard & UIKit (Day 22): UIAlertControllerによるアラートとアクションシート
  23. 23. 完全に理解する Storyboard & UIKit (Day 23): UIDatePickerやUIPickerViewの実装
  24. 24. 完全に理解する Storyboard & UIKit (Day 24): Storyboard Referenceを用いたStoryboard分割
  25. 25. 完全に理解する Storyboard & UIKit (Day 25): XIBとStoryboardの使い分け・併用
  26. 26. 完全に理解する Storyboard & UIKit (Day 26): UIAppearanceによるアプリ全体の色・スタイル管理
  27. 27. 完全に理解する Storyboard & UIKit (Day 27): ダークモード対応とアセットカタログ
  28. 28. 完全に理解する Storyboard & UIKit (Day 28): Accessibility(VoiceOver対応など)のUI設計
  29. 29. 完全に理解する Storyboard & UIKit (Day 29): UIKitからSwiftUIへの移行 / UIKitでのSwiftUI利用
  30. 30. 完全に理解する Storyboard & UIKit (Day 30): 実践:1つのアプリをStoryboardとUIKitで完成させる
Related Articles