WKWebViewのallowsBackForwardNavigationGesturesとnavigationControllerのジェスチャーを両立させる

概要

最近UIWebViewで書いていたコードをWKWebViewに書き換える機会があり、どんな違いがあるかを調査しました。
その中にWKWebView内の履歴をスワイプで戻れる機能を発見。
ここでふと、「WKWebViewとnavigationControllerのスワイプ、どっちが優先されるのか?」と言う疑問が出てきたので、実際に検証してみました。

検証方法

  1. 最初の画面にてきとーにボタンを配置して、押したらWKWebViewが入っているviewControllerに遷移
  2. webView内でページ遷移(今回はGoogleにアクセス→検索をしてみた)
  3. スワイプで戻ってみる

検証結果

結論から言うと
画面ごと戻ることもあれば、履歴だけ戻ることもあった。
どちらが優先ということはなく規則性はないように見えた。

両立させてみた

  • 以下の動作をするように変更してみた
    • webViewの履歴があれば履歴を戻す
    • なければ画面を戻す
import UIKit
import WebKit

class WebViewController: UIViewController {

    let webView = WKWebView()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(webView)

        // スワイプで履歴を戻る/進む有効化
        webView.allowsBackForwardNavigationGestures = true

        // navigationControllerのスワイプジェスチャーを制御できるようdelegateにselfを指定
        navigationController?.interactivePopGestureRecognizer?.delegate = self

        webView.load(URLRequest(url: URL(string: "https://google.co.jp")!))
    }
}

extension WebViewController: UIGestureRecognizerDelegate {
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        // webViewの履歴がなければnavigationControllerのスワイプジェスチャーを有効化
        return !webView.canGoBack
    }
}
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.