15
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-17

概要

最近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
    }
}
15
5
5

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
15
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?