Swift

【Swift3.0】たった3行追加するだけでスワイプバックを画面のどこからでも有効にする

iOSアプリには標準でエッジスワイプが備わっていますが、画面の左端からスワイプした時しかできず、範囲がとても狭いです。
それを画面のどこからでもスワイプしたら戻れるような挙動にしたい場合があると思いますが、アップル純正のあのスワイプしたら前の画面がちょっとずつ現れてっていう挙動を1から自分で実装するのは難しいです。
そこで今回は、スワイプバックの挙動自体はアップル純正のものをそのまま使わせてもらって、デフォルトでは画面の左端からスワイプした時しか反応しなかったのを画面のどこからでも反応するようにします。

let target = self.navigationController?.value(forKey: "_cachedInteractionController")
  let recognizer = UIPanGestureRecognizer(target: target, action: Selector(("handleNavigationTransition:")))
  self.view.addGestureRecognizer(recognizer)

今回追加するのはこのたったの3行だけです。
これをviewDidLoadに追加すればどこからでもスワイプバックを実現することができます。
簡単ですね!(^o^)

おまけですが、これをやろうとしたときに一部の画面だけ、このどこでもスワイプバックを実装したいという要件だったので、使うViewControllerに毎回書くのも効率悪いので、次のように

protocol SwipeBackable {
      func setSwipeBack()
  }

  extension SwipeBackable where Self: UIViewController {
      func setSwipeBack() {
          let target = self.navigationController?.value(forKey: "_cachedInteractionController")
          let recognizer = UIPanGestureRecognizer(target: target, action: Selector(("handleNavigationTransition:")))
          self.view.addGestureRecognizer(recognizer)
      }
  }

  class ViewController: UIViewController {    
      override func viewDidLoad() {
          super.viewDidLoad()
          setSwipeBack()
      }
  }

  extension ViewController: SwipeBackable {}

SwipeBackableを作成し、使いたいViewControllerはこのようにSwipeBackableを継承して使う形にしました。