Ios WKWebview允许反向导航手势和UINavigationController交互EPGPEstureRecognitizer都已启用

Ios WKWebview允许反向导航手势和UINavigationController交互EPGPEstureRecognitizer都已启用,ios,uinavigationcontroller,wkwebview,Ios,Uinavigationcontroller,Wkwebview,嵌入在导航控制器中的我的视图控制器包含一个WKWebview,我希望在其上启用以下逻辑: 如果webview中存在后退项,则做出左屏幕边缘手势应返回webview中的一页(当AllowsBackForwardNavigationSirters设置为yes时,webview的正常行为)。当没有任何返回项时,它应该在导航控制器(interactivePopGestureRecognizer)中弹出一个页面。我同时启用了这两个选项,并得到随机结果,有时在webview中返回一个页面,有时在导航堆栈中返

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

如果webview中存在后退项,则做出左屏幕边缘手势应返回webview中的一页(当AllowsBackForwardNavigationSirters设置为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;
  }
}
但当我刷卡并收到“WKCompositingView未识别的选择器发送到实例”时,它崩溃了


知道我哪里出错了吗?我猜在哪个手势优先的问题上存在冲突,但我不知道在哪里添加这个逻辑,这样webview和包含其视图控制器的导航控制器都可以和平地生活。

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

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

    let swipe = UISwipeGestureRecognizer(target: self, action: #selector(goBack))
    swipe.direction = UISwipeGestureRecognizerDirection.right
    swipe.delegate = self.navigationController
    webView.addGestureRecognizer(swipe)
然后,添加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
}
}


但它有一个小缺陷,即滑动效果与本机不同,在不进行润色的情况下滑动时会显示新的viewController。

也许您可以使用canGoback的观察者,如

RACObserve(self.wk_webView, canGoBack)
如果该值为真,请执行以下操作:

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}

对于以后的iOS版本,导航手势似乎会覆盖wkwebview one,因此webview交互应该始终是真实的,只要用户是否在第一页上,就可以禁用导航手势。没有任何解释的代码转储很少有帮助。堆栈溢出是关于学习,而不是提供盲目复制和粘贴的代码片段。请回答您的问题,并解释它如何比OP提供的更好地工作。看见
_webView.allowsBackForwardNavigationGestures = YES;

-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    self.navigationController.interactivePopGestureRecognizer.enabled = _webView.canGoBack ? NO : YES;
}