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

完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理

S7r1n9y

S7r1n9y

Engineer

完全に理解する Storyboard & UIKit
21 / 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 21): Gesture Recognizerによるタッチ処理

Sponsored

完全に理解する Storyboard & UIKit (Day 21): Gesture Recognizerによるタッチ処理

UIButtonは「タップ(クリック)」しか検知できません。しかし、スマートフォンならではの直感的な操作といえば、画像を二本指で拡大する「ピンチ」、画面を横に払う「スワイプ」、アイコンを移動させる「ドラッグ(パン)」などです。

これら複雑なタッチイベントを簡単に検知し、UIViewに処理を行わせるための強力なクラス群が UIGestureRecognizer です。


1. UIGestureRecognizer の種類

iOSが標準で提供している主なジェスチャー認識クラスは以下の通りです。基本的にはこれらをつなぎ合わせて使います。

  • UITapGestureRecognizer: タップ(1回、またはダブルタップ等)。
  • UISwipeGestureRecognizer: スワイプ(上下左右にサッと払う動作)。
  • UIPanGestureRecognizer: パン(押したまま指を引きずる動作。ドラッグ)。
  • UIPinchGestureRecognizer: ピンチ(二本指でつまむ・広げる動作。拡大縮小)。
  • UIRotationGestureRecognizer: ローテーション(二本指で回転させる動作)。
  • UILongPressGestureRecognizer: ロングプレス(長押し)。

2. StoryboardでGestureを設定する

Storyboard(Interface Builder)を使うと、ジェスチャーの追加もドラッグ&ドロップで視覚的に行えます。

  1. 対象ビューの準備:

    • ジェスチャーを追加したいビュー(例えば UIImageView)を選択します。
    • Attributes Inspector (⌥⌘4) を開き、User Interaction Enabled のチェックボックスを必ずONにしてください。
    • UIView はデフォルトでONですが、UIImageViewUILabel はデフォルトでOFF(タッチを無視する)になっているため、これがないとジェスチャーが絶対に動かずハマる原因になります。
  2. ジェスチャーの追加:

    • ライブラリパネル(⇧⌘L)を開き、Tap Gesture Recognizer などを検索します。
    • 見つけたら、対象のビュー(UIImageView等)の上に直接ドラッグ&ドロップします。
    • すると、キャンバス上部のView Controllerのアイコン群(黄色い丸などの並び)に、ジェスチャーのアイコンが追加されます。
  3. コードへの接続 (IBAction):

    • キャンバス上部に追加されたジェスチャーアイコンから、ViewControllerのSwiftコードへ Control+ドラッグ し、Action として接続します。
swift
@IBAction func imageTapped(_ sender: UITapGestureRecognizer) { // 型がUITapGestureRecognizerになる print("画像がタップされました!") }

3. コードでGestureを設定する

動的に生成したビューに対するジェスチャー追加や、Storyboardを使わない場合はコードで実装します。(実際にはこちらの方がよく使われます)。

swift
@IBOutlet weak var myBoxView: UIView! override func viewDidLoad() { super.viewDidLoad() // 1. ジェスチャーのインスタンスを作成(発動時に呼ぶメソッドを #selector で指定) let swipeGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(_:))) // 2. ジェスチャーのプロパティを設定(例: 右方向へのスワイプとする) swipeGesture.direction = .right // 3. 対象のビューにジェスチャーを追加する myBoxView.addGestureRecognizer(swipeGesture) // 忘れずに!(UIViewはデフォルトtrueですが念の為) myBoxView.isUserInteractionEnabled = true } // ジェスチャー発動時に呼ばれるメソッド (@objc が必須です) @objc func handleSwipe(_ sender: UISwipeGestureRecognizer) { if sender.direction == .right { print("右にスワイプされました") // Day 20の知識を使って、スワイプされたら色を変えながら右に飛ばすアニメーション UIView.animate(withDuration: 0.3) { self.myBoxView.frame.origin.x += 200 self.myBoxView.alpha = 0 } } }

4. PanGestureでViewをドラッグ移動させる

UIPanGestureRecognizer を使うと、指の動きに合わせて View をドラッグ移動させる処理が簡単に書けます。

swift
@objc func handlePan(_ sender: UIPanGestureRecognizer) { // 1. 動かされている対象のビューを取得 guard let targetView = sender.view else { return } // 2. タッチ開始位置からの移動量(translation)を取得する let translation = sender.translation(in: self.view) // 3. 中心座標(center)に移動量を足して、ビューを動かす targetView.center = CGPoint(x: targetView.center.x + translation.x, y: targetView.center.y + translation.y) // 4. 移動量をゼロにリセットする(超重要:これをしないと移動量が無限に加算され加速していく) sender.setTranslation(.zero, in: self.view) // ドラッグが終わった時(指を離した時)の処理 if sender.state == .ended { print("ドラッグ終了位置: \(targetView.center)") } }

📝 今日のまとめ

  • 様々なタッチ操作を検知するには UIGestureRecognizer のサブクラスを使用する。
  • UIImageViewやUILabelに使用する場合は、必ず Is User Interaction Enabled をONにする
  • UITapGesture はクリック、UISwipeGesture は弾く操作、UIPanGesture はドラッグ操作。
  • ジェスチャー発動時のメソッドには @objc をつけ、sender から状態(.state)や移動量を取得する。

ユーザーのタッチ入力を完全に自在に操れるようになりました。 明日の Day 22 では、ユーザーに重要な情報を伝えたり、選択を迫ったりする際に多用されるポップアップUI、UIAlertController(アラートとアクションシート)の実装方法を学びます。

END OF FILE
この記事は役に立ちましたか?
SNSでシェアする
後で読む(ブックマーク)
完全に理解する Storyboard & UIKit
21 / 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