タップ操作はスマホアプリの便利な機能です。UIGestureRecognizer ではタップ、スワイプ(フリック)等々を扱えますが、まず手っ取り早くタップを扱うUITapGestureRecognizerと、長押しのUILongPressGestureRecognizerの使い方を見てみたいと思います。
Xcode 11.3.1
UIGestureRecognizer
SwiftUIでのタップ、長押しは以下を参照してください
UIGestureRecognizerには2タイプあり、1度だけ認知するものUITapGestureRecognizerと、連続して認知するものUILongPressGestureRecognizerがあります。例えばLongPressを認知した指がある一定以上の時間同じ場所にあることが条件です。もし移動した場合、LongPressはキャンセルされます。
UITapGesture
タップを認識する為に、UITapGestureRecognizer を使ってインスタンスを生成します。
1 2 3 |
let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer( target: self, action: #selector(ViewController.tapped(_:))) |
View に インスタンスを追加します
1 |
self.view.addGestureRecognizer(tapGesture) |
selector でタップされたときに呼びだされるメソッドを登録
タップされた時に、メソッドが呼び出されます
1 2 3 |
@objc func tapped(_ sender: UITapGestureRecognizer){ // 処理 } |
実際のコードです、Delegate をセットします。
ViewController.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import UIKit // UIGestureRecognizerDelegate を追加 class ViewController: UIViewController ,UIGestureRecognizerDelegate { override func viewDidLoad() { super.viewDidLoad() print("viewDidLoad") let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer( target: self, action: #selector(ViewController.tapped(_:))) // デリゲートをセット tapGesture.delegate = self self.view.addGestureRecognizer(tapGesture) } @objc func tapped(_ sender: UITapGestureRecognizer){ if sender.state == .ended { print("タップ") } } } |
実際にタップして「タップ」のログが出てくれば成功です。
1 2 3 4 |
タップ タップ タップ タップ |
UILongPressGesture
storyboardにUILabelを置いて、紐付けします。
1 |
@IBOutlet var label:UILabel! |
UILongPressGestureRecognizerを同様に設定すればできあがりです。
ViewController.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
import UIKit // UIGestureRecognizerDelegate を追加 class ViewController: UIViewController ,UIGestureRecognizerDelegate { @IBOutlet var label:UILabel! var count = 0 override func viewDidLoad() { super.viewDidLoad() let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer( target: self, action: #selector(ViewController.tapped(_:))) // デリゲートをセット tapGesture.delegate = self self.view.addGestureRecognizer(tapGesture) // ロングプレス let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(ViewController.longPress(_:))) longPressGesture.delegate = self // Viewに追加. self.view.addGestureRecognizer(longPressGesture) } // Tap イベント @objc func tapped(_ sender: UITapGestureRecognizer){ if sender.state == .ended { label.text = "Tapped ! \(count)" count += 1 } // これは無い else if sender.state == .began { print("Tap began") } } // Long Press イベント @objc func longPress(_ sender: UILongPressGestureRecognizer){ if sender.state == .began { // 開始は認知される print("LongPress began") } else if sender.state == .ended { label.text = "Long Pressed !" } } } |
TapとLong Pressを表示するようにしてみます。
タップと長押しがそれぞれ認識されたでしょうか
References:
UIGestureRecognizer – UIKit | Apple Developer Documentation
UITapGestureRecognizer – UIKit | Apple Developer Documentation
UILongPressGestureRecognizer – UIKit | Apple Developer …