WKWebview allowsBackForwardNavigationGestures 和 UINavigationController interactivePopGestureRecognizer 都启用
WKWebview allowsBackForwardNavigationGestures and UINavigationController interactivePopGestureRecognizer both enabled
我嵌入在导航控制器中的视图控制器包含一个 WKWebview,我想在其上启用以下逻辑:
如果 webview 中存在后退项目,做出左屏幕边缘手势应该在 webview 中返回一页(当 allowsBackForwardNavigationGestures 设置为 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 和包含其视图控制器的导航控制器都能和平地生活。
我有同样的问题。请尝试以下方式:
首先,向 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;
}
_webView.allowsBackForwardNavigationGestures = YES;
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
self.navigationController.interactivePopGestureRecognizer.enabled = _webView.canGoBack ? NO : YES;
}
我嵌入在导航控制器中的视图控制器包含一个 WKWebview,我想在其上启用以下逻辑:
如果 webview 中存在后退项目,做出左屏幕边缘手势应该在 webview 中返回一页(当 allowsBackForwardNavigationGestures 设置为 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 和包含其视图控制器的导航控制器都能和平地生活。
我有同样的问题。请尝试以下方式:
首先,向 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;
}
_webView.allowsBackForwardNavigationGestures = YES;
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
self.navigationController.interactivePopGestureRecognizer.enabled = _webView.canGoBack ? NO : YES;
}