【问题标题】:WKWebview allowsBackForwardNavigationGestures and UINavigationController interactivePopGestureRecognizer both enabledWKWebview 允许BackForwardNavigationGestures 和 UINavigationController interactivePopGestureRecognizer 都启用
【发布时间】:2016-07-21 09:29:53
【问题描述】:

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

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

-(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 unrecognized selector sent to instance”。

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

【问题讨论】:

  • 对于更高的 iOS 版本,导航手势似乎覆盖了 wkwebview 之一,因此 webview 交互应该始终为真,如果用户在第一页上,只需禁用导航手势即可。

标签: ios uinavigationcontroller wkwebview


【解决方案1】:
_webView.allowsBackForwardNavigationGestures = YES;

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

【讨论】:

  • 没有任何解释的代码转储很少有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请edit您的问题并解释它如何比OP提供的更好。见How to Answer
【解决方案2】:

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

首先,在 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。

【讨论】:

    【解决方案3】:

    也许你可以为 canGoback 使用观察者,比如

    RACObserve(self.wk_webView, canGoBack)
    

    如果该值为真,则执行

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

    【讨论】:

      猜你喜欢
      • 2014-07-19
      • 2014-01-26
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 2020-07-21
      • 1970-01-01
      • 2019-10-31
      相关资源
      最近更新 更多