はじめに
アプリでタップもしくは長押しの処理を行うにはUIGestureRecognizer
のUITapGestureRecognizer
(タップ)と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