Ios 如何只检测短抽头

Ios 如何只检测短抽头,ios,uikit,uigesturerecognizer,Ios,Uikit,Uigesturerecognizer,在我的视图控制器中,我有一个WKWebView,我使用uitappesturerecognizer来检测web视图上的点击,以显示/隐藏导航和状态栏。我还使用taps+javascript来检测web内容的特殊部分何时被点击 WKWebView使用长按来允许用户选择文本 超长压力机工作得很好。网页内容由WKWebView按预期选择,生活良好 我的问题是,当用户应用“短”或“长”按键时,因为UITapgestureRecognitor将其识别为轻触。WKWebView选择文本,因此用户似乎按下的时

在我的视图控制器中,我有一个
WKWebView
,我使用
uitappesturerecognizer
来检测web视图上的点击,以显示/隐藏导航和状态栏。我还使用taps+javascript来检测web内容的特殊部分何时被点击

WKWebView使用长按来允许用户选择文本

超长压力机工作得很好。网页内容由WKWebView按预期选择,生活良好

我的问题是,当用户应用“短”或“长”按键时,因为UITapgestureRecognitor将其识别为轻触。WKWebView选择文本,因此用户似乎按下的时间足够长,但一旦释放,UITapGestureRecognitor将触发指定的操作,显示/隐藏导航栏的“我的代码”将生效

我只想在用户应用非常短的点击时显示/隐藏导航栏。如果它们接触的时间足够长,WKWebView可以选择文本,我想让WKWebView来处理它

我希望通过触摸持续时间来过滤点击,但我还没有找到一种方法来确定这些信息

我错过什么了吗?我可以使用UITapGestureRecognitor实现这一点,还是需要其他方法


我的目标是iOS 8和iOS 9。

如果您有权访问WKWebView使用的手势识别器来选择文本,那么您可以使用
RequireTestureRecognitizerToFail:
设置短点击识别器以要求WKWebView识别器失败

如果您无法访问WKWebView使用的手势识别器,则可以采用以下更为黑客化的方法:

  • 创建
    ui长按手势识别器
    。这个长按识别器本身不做任何事情,但第2步需要它
  • 在短按识别器中,使用
    requiregesturecognifizertofail:
    ,从步骤1指定
    ui长按gesturecognifizer

  • 请注意,如果WKWebView在引擎盖下使用
    UILongPressGestureRecognitor
    ,则第二种方法只能起作用。

    对于WKWebView,最简单的解决方案就是使用WKNavigationDelegate协议中的方法,并在其中决定是否处理该url

    public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction,
                          decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    
        if let url = navigationAction.request.url, url.scheme?.lowercased() == Constants.mailToScheme {
          UIApplication.shared.open(url, options: [:])
          decisionHandler(.cancel)
        } else {
          decisionHandler(.allow)
        }
      }
    

    如果@melany代码无法正常工作,请进行以下更改

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: ((WKNavigationActionPolicy) -> Void)) {
    
            switch navigationAction.navigationType {
            case .linkActivated:
                UIApplication.shared.openURL(navigationAction.request.url!)
                decisionHandler(.cancel)
                return
            default:
                break
            }
            decisionHandler(.allow)
        }
    

    也许您可以利用
    UITouch
    属性,
    timestamp
    。然后,您可以检查
    -(void)touchesbeated:(NSSet*)toucheevent:(UIEvent*)事件之间的时间差
    -(void)touchesend:(NSSet*)toucheevent:(UIEvent*)event并据此采取行动。谢谢@BenJammin。我刚刚阅读了
    UIResponder
    ,并在我的
    WKWebView
    子类中添加了touchsbegind和touchsended。不幸的是,他们没有接到电话。我使用了NSLog和断点来验证这一点。有什么想法吗?谢谢道格的想法。我无法找到访问WKWebView识别器的方法。我在一个带有断点的子类中停止。WKWebView上唯一的识别器就是我添加的识别器。我查看了它的scrollView,刚刚找到了3个UIScrollViewXYZGestureRecognitor。接下来,我实现了您的“黑客”方法,第一次通过时,它似乎运行良好。明天我会再测试一次,然后回来报告。谢谢,这对我帮助很大。我通过浏览webView.scrollView.subviews的手势识别器找到了我正在寻找的手势识别器:(不过也有点不太成熟)