LoginSignup
4
3

More than 3 years have passed since last update.

【Swift】iOSアプリでタップ、ロングタップの認識をする方法

Posted at

はじめに

アプリでタップもしくは長押しの処理を行うにはUIGestureRecognizerUITapGestureRecognizer(タップ)とUILongPressGestureRecognizer(長押し)を用います。
汎用性が高い上に比較的実装が簡単なので、自分が学習したことも含めまとめてみました。

開発環境

  • MacOS Big Sur version 11.2.3
  • Xcode12.4
  • Swift5.3.2

UITapGestureRecognizerとUILongPressGestureRecognizerの違い

UITapGestureRecognizer

普通はタップ検知しない場所に置くことでイベントを検知する。
シングルタップ、ダブルタップなどのタップ数、タップした際の指の本数により対象を絞り込むことが可能
タップした際に検知されるため誤タップが起きやすい

以下から各条件の設定が可能

numberOfTouchesRequired 認識に必要な指の本数(デフォルト:1)
numberOfTapsRequired 認識に必要なタップ数(デフォルト:1)
buttonMaskRequired 認識のために押さなければならないボタンのビットマスク

UILongPressGestureRecognizer

ロングプレス(長押し)を検知する。タップを保持することでイベントが検知される。
長押しの継続時間、指の本数により絞り込むことが可能

以下から各条件の設定が可能

minimumPressDuration 認識に必要な長押しの時間(デフォルト:0.5)
numberOfTouchesRequired 認識に必要な指の本数(デフォルト:1)
numberOfTapsRequired 認識に必要なビューのタップ数(デフォルト:0)
allowableMovement 指のずれを許容する範囲(デフォルト:10)

タップ

コード全文

import UIKit

    //UIGestureRecognizerDelegateを追加
class ViewController: UIViewController, UIGestureRecognizerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        //インスタンスの生成
        let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(
            target: self,
            action: #selector(self.tapAction(_:))
        )

        //デリゲートをセット
        tapGesture.delegate = self

        //viewにtapGestureを追加
        self.view.addGestureRecognizer(tapGesture)

    }

        //タップ時に実行されるメソッド
    @objc func tapAction(_ sender: UITapGestureRecognizer) {
        if sender.state == .ended {
        //タップ終了時の処理
        }
    }
}

解説

タップアクションのためのUIGestureRecognizerインスタンスを生成します

let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(
            target: self,
            action: #selector(self.tapAction(_:))
        )

デリゲートをセットし、ViewControllerのviewの上にtapActionをaddします

tapGesture.delegate = self

self.view.addGestureRecognizer(tapGesture)

stateプロパティである.endedを用いてタップ終了時の処理を実装(ここでは空白)

 @objc func tapAction(_ sender: UITapGestureRecognizer) {
        if sender.state == .ended {

        }
    }

長押し

基本的にはタップのコードと同じ構造になります。

import UIKit
//UIGestureRecognizerDelegate を追加
class ViewController: UIViewController,UIGestureRecognizerDelegate{


    override func viewDidLoad() {
        super.viewDidLoad()
        //インスタンスを生成する
               let longPressGesture: UILongPressGestureRecognizer = UILongPressGestureRecognizer(
                   target: self,
                   action: #selector(self.longPressAction(_:))
               )


               //デリゲートをセット
               longPressGesture.delegate = self

               //viewにlongPressGestureを追加
               self.view.addGestureRecognizer(longPressGesture)

    }
    //長押し時に実行されるメソッド
        @objc func longPressAction(_ sender: UILongPressGestureRecognizer) {
            if sender.state == .ended {
                //ここに、長押し終了時に実行したい処理を記載する
            }
        }

}

複数のGestureの制御

タップや長押しに限らず複数のGesture認識の制御、同時認識、失敗の制御などを行う際にはUIGestureRecognizerDelegateのメソッドを用います。(例:一つのVCでシングルタップとダブルタップの認識をさせたい等)

メソッド 制御
gestureRecognizerShouldBegin Gestureの認識の開始
shouldRecognizeSimultaneouslyWith Gestureの同時認識
shouldRequireFailureOf 競合のGestureによる自身のGestureの失敗
shouldBeRequiredToFailBy 競合のGestureに対する失敗の要求
shouldReceive touch Gestureのtouchの受け取り
shouldReceive press Gestureのpressの受け取り

詳しくは参考にさせていただきましたこの記事がわかりやすいです
↓↓↓
よくわかるUIGestureRecognizerDelegate

終わりに

UIGestureRecognizerには他にもPinch,Rotation,SwipeなどのGestureも存在するので、機会があればそちらも書こうと思います。

参考

UITapGestureRecognizerDelegate - UIKit | Apple Developer Documentation
UILongPressGestureRecognizerDelegate - UIKit | Apple Developer Documentation
UIGestureRecognizerDelegate - UIKit | Apple Developer Documentation
よくわかるUIGestureRecognizerDelegate

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3