概要
最近UIWebViewで書いていたコードをWKWebViewに書き換える機会があり、どんな違いがあるかを調査しました。
その中にWKWebView内の履歴をスワイプで戻れる機能を発見。
ここでふと、「WKWebViewとnavigationControllerのスワイプ、どっちが優先されるのか?」と言う疑問が出てきたので、実際に検証してみました。
検証方法
- 最初の画面にてきとーにボタンを配置して、押したらWKWebViewが入っているviewControllerに遷移
- webView内でページ遷移(今回はGoogleにアクセス→検索をしてみた)
- スワイプで戻ってみる
検証結果
結論から言うと
画面ごと戻ることもあれば、履歴だけ戻ることもあった。
どちらが優先ということはなく規則性はないように見えた。
両立させてみた
- 以下の動作をするように変更してみた
- 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
}
}