【UIKit】左右のスワイプを検知する

2023.01.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

UIKitの画面で左右のスワイプを検知する方法を調べました。

環境

  • Xcode 14.1

スワイプジェスチャを追加

スワイプを検知する為に、view.addGestureRecognizerUISwipeGestureRecognizerを追加します。

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はデフォルトでは右方向のスワイプしか検知してくれません。

UISwipeGestureRecognizerdirectionというプロパティを持っており、デフォルトではその値がrightになっている為です。

UISwipeGestureRecognizer.Direction

var direction: UISwipeGestureRecognizer.Direction { get set }

このDirectionstructになっており、4つのstaticプロパティを持っています。

  • static var right
    • 右方向にタッチまたはスワイプ
  • static var left
    • 左方向にタッチまたはスワイプ
  • static var up
    • 上方向にタッチまたはスワイプ
  • static var down
    • 下方向にタッチまたはスワイプ

このdirectionの値を変更することで検知するスワイプジェスチャの方向を変えることが出来ます。

左右方向のスワイプジェスチャを追加

愚直に1つずつスワイプジェスチャを追加することも出来ますが、今回は配列をforEachで回してジェスチャを追加することにしました。

ただUISwipeGestureRecognizer.DirectionSequenceに準拠しておらず、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
    }
}

引数で渡ってくるUISwipeGestureRecognizerdirectionの値を持っているので、その値によって処理を分岐させます。今回は.up.downは対象外にしていますが、必要であればケースに追加することでスワイプジェスチャを検知出来ます。

これで左右のスワイプを検知できるようになりました!

おわりに

UIGestureRecognizerにはまだまだ種類があるので、深掘りしてみるのも楽しいかもしれません。SwiftUIも楽しいですが、UIKitも楽しいですね。

参考