WKWebview 允许启用BackForwardNavigationGestures 和 UINavigationController interactivePopGestureRecognizer

Alo*_*hay 5 uinavigationcontroller ios wkwebview

我的嵌入在导航控制器中的视图控制器包含一个 WKWebview,我想在其上启用以下逻辑:

如果 webview 中存在后退项目,则左屏幕边缘手势应返回 webview 中的一页(当allowBackForwardNavigationGestures 设置为yes 时,webview 的正常行为)。当没有任何返回项时,它应该在导航控制器(interactivePopGestureRecognizer)中弹出一页。我启用了这两个功能,然后得到随机结果,有时我会返回 webview 中的一页,有时我会返回导航堆栈中的主页。我尝试了以下逻辑:

-(void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation {

  if (webView.backForwardList.backItem) {
    MYappDelegate.mainNavigationController.interactivePopGestureRecognizer.enabled = NO;
    self.webView.allowsBackForwardNavigationGestures = YES;
  } else {
    MYappDelegate.mainNavigationController.interactivePopGestureRecognizer.enabled = YES;
    self.webView.allowsBackForwardNavigationGestures = NO;
  }
}
Run Code Online (Sandbox Code Playgroud)

但是当我滑动时它崩溃了,我收到“WKCompositingView 无法识别的选择器发送到实例”。

任何想法我哪里出错了?我猜有一个关于哪个手势优先的冲突,但我无法弄清楚在哪里添加这个逻辑,所以 webview 和包含其视图控制器的导航控制器都可以和平地生活。

Jen*_*ong 1

我有同样的问题。请尝试以下方法:

首先,向WebView添加自定义手势:

    let swipe = UISwipeGestureRecognizer(target: self, action: #selector(goBack))
    swipe.direction = UISwipeGestureRecognizerDirection.right
    swipe.delegate = self.navigationController
    webView.addGestureRecognizer(swipe)
Run Code Online (Sandbox Code Playgroud)

然后,添加一个 UIGestureDelegate 方法来同时处理手势,

extension UINavigationController: UIGestureRecognizerDelegate{
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return gestureRecognizer is UIScreenEdgePanGestureRecognizer
}

public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}
Run Code Online (Sandbox Code Playgroud)

}

但它有一个小缺陷,即滑动效果与原生效果不同,滑动时无需触摸即可显示新的 viewController。