UIKitの画面で左右のスワイプを検知する方法を調べました。
環境
- Xcode 14.1
スワイプジェスチャを追加
スワイプを検知する為に、view.addGestureRecognizer
にUISwipeGestureRecognizer
を追加します。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setup()
}
private func setup() {
view.addGestureRecognizer(UISwipeGestureRecognizer(target: self,
action: #selector(swipe)))
}
@objc private func swipe(_ sender: UISwipeGestureRecognizer) {
print("swipe")
}
}
これでスワイプジェスチャを検知して何らかの処理を実行できるようになったのですが、UISwipeGestureRecognizer
はデフォルトでは右方向のスワイプしか検知してくれません。
UISwipeGestureRecognizer
はdirection
というプロパティを持っており、デフォルトではその値がright
になっている為です。
UISwipeGestureRecognizer.Direction
var direction: UISwipeGestureRecognizer.Direction { get set }
このDirection
はstruct
になっており、4つのstatic
プロパティを持っています。
static var right
- 右方向にタッチまたはスワイプ
static var left
- 左方向にタッチまたはスワイプ
static var up
- 上方向にタッチまたはスワイプ
static var down
- 下方向にタッチまたはスワイプ
このdirection
の値を変更することで検知するスワイプジェスチャの方向を変えることが出来ます。
左右方向のスワイプジェスチャを追加
愚直に1つずつスワイプジェスチャを追加することも出来ますが、今回は配列をforEach
で回してジェスチャを追加することにしました。
ただUISwipeGestureRecognizer.Direction
はSequence
に準拠しておらず、forEach
が実行出来ない為、SwipeGestureDirection
というenum
を作成しました。
SwipeGestureDirection
enum SwipeGestureDirection {
case left
case right
case up
case down
var recognizerDirection: UISwipeGestureRecognizer.Direction {
switch self {
case .left:
return .left
case .right:
return .right
case .up:
return .up
case .down:
return .down
}
}
}
今回は左右の検知のみなので、.up
と.down
は不要です。
各directionのジェスチャを追加
private func setup() {
let directions: [SwipeGestureDirection] = [.right, .left]
directions.forEach { direction in
let swipeGestureRecognizer = UISwipeGestureRecognizer(target: self,
action: #selector(swipe))
swipeGestureRecognizer.direction = direction.recognizerDirection
view.addGestureRecognizer(swipeGestureRecognizer)
}
}
検知したいスワイプ方向をSwipeGestureDirection
配列を生成して、その配列でforEach
処理を実行します。その中で、swipeGestureRecognizer.direction
にそれぞれのUISwipeGestureRecognizer.Direction
を設定しています。
swipe検知側の処理
@objc private func swipe(_ sender: UISwipeGestureRecognizer) {
switch sender.direction {
case .left:
print("swipe left")
case .right:
print("swipe right")
default:
break
}
}
引数で渡ってくるUISwipeGestureRecognizer
がdirection
の値を持っているので、その値によって処理を分岐させます。今回は.up
、.down
は対象外にしていますが、必要であればケースに追加することでスワイプジェスチャを検知出来ます。
これで左右のスワイプを検知できるようになりました!
おわりに
UIGestureRecognizer
にはまだまだ種類があるので、深掘りしてみるのも楽しいかもしれません。SwiftUI
も楽しいですが、UIKit
も楽しいですね。