LoginSignup
3
0

[UIKit] Push遷移したページをどこからでもスワイプで戻れるようにする

Last updated at Posted at 2023-08-23

真ん中スワイプで戻る方法を模索するのに一苦労したので、備忘録として残しておきます。

実装

import UIKit

final class NavigationController: UINavigationController {
    private let fullWidthBackGestureRecognizer = UIPanGestureRecognizer()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupFullWidthBackGesture()
    }

    private func setupFullWidthBackGesture() {
        guard
            let interactivePopGestureRecognizer = interactivePopGestureRecognizer,
            let targets = interactivePopGestureRecognizer.value(forKey: "targets")
        else {
            return
        }

        fullWidthBackGestureRecognizer.setValue(targets, forKey: "targets")
        fullWidthBackGestureRecognizer.delegate = self

        view.addGestureRecognizer(fullWidthBackGestureRecognizer)
    }
}

extension NavigationController: UIGestureRecognizerDelegate {
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        let isSystemSwipeToBackEnabled = interactivePopGestureRecognizer?.isEnabled == true
        let isThereStackedViewControllers = viewControllers.count > 1
        return isSystemSwipeToBackEnabled && isThereStackedViewControllers
    }
}

interactivePopGestureRecognizerで端スワイプを検知しているので、Objective-Cの黒魔術を使用し、GestureをPanGestureに置き換えることで画面上のどこからでもスワイプを検知できるようになりました。

使用方法

let controller = NavigationController(rootViewController: HogeViewController())
present(controller, animated: true)

さいごに

これで端スワイプではなく、真ん中スワイプでpopすることができました!
SwiftUIで使用するにはintrospectを使うとできます。

3
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0