
【UIKit】左右のスワイプを検知する
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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も楽しいですね。











