iOS 如何讓WKWebView側滑返回時html逐級返回,而不是直接返回到上級控制器?
阿新 • • 發佈:2019-01-22
iOS使用WKWebView來載入html頁面時,如果html頁面只有一級的話,那麼側滑返回沒什麼問題,但如果html是多級的話,那麼側滑返回時有時就會出現直接返回到上級控制器,而不是返回上一級html頁面。這是因為html頁面的側滑返回和導航控制器的側滑返回發生衝突了,系統無法識別到底是哪一種側滑返回。
WKWebView有一個canGoBack屬性(A Boolean value indicating whether there is a back item in the back-forward list that can be navigated to.),該屬性為true/YES時表示webview當前載入的html的頁面級數 >= 2 ,為false/NO時,表示當前處於html的一級頁面。
那麼,我們可以通過KVO來監聽webview的canGoBack屬性值變化來解決html頁面的側滑返回和導航控制器的側滑返回衝突的問題:即當canGoBack屬性值變為true/YES時,禁用導航控制器的側滑返回手勢;當canGoBack的屬性值變為false/NO時,解禁導航控制器的側滑返回手勢。
具體操作如下:
Swift版:
private let canGoBackKeyPath = "canGoBack" webView.addObserver(self, forKeyPath: canGoBackKeyPath, options: .new, context: nil) open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) { guard let theKeyPath = keyPath, object as? WKWebView == webView else { super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) return } if theKeyPath == canGoBackKeyPath{ if let newValue = change?[NSKeyValueChangeKey.newKey]{ let newV = newValue as! Bool if newV == true{ self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false; }else{ self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true; } } } } deinit { webView.removeObserver(self, forKeyPath: canGoBackKeyPath, context: nil) }
OC版:
懶得寫了,自己照著Swift版的轉換一下吧~