真ん中スワイプで戻る方法を模索するのに一苦労したので、備忘録として残しておきます。
実装
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を使うとできます。