簡體   English   中英

如何僅檢測短按

[英]How to detect only short taps

在我的視圖控制器中,我有一個WKWebView ,我使用一個UITapGestureRecognizer來檢測 webview 上的點擊,以顯示/隱藏導航和狀態欄。 我還使用 taps+javascript 來檢測 Web 內容的特殊部分何時被點擊。

WKWebView 使用長按來允許用戶選擇文本。

超長按效果很好。 網頁內容按預期被WKWebView選中,生活不錯。

我的問題是當用戶應用“更短”的長按時,因為 UITapGestureRecognizer 將它們識別為點擊。 WKWebView 選擇文本,所以看起來用戶按下了足夠長的時間,但是在釋放 UITapGestureRecognizer 時會觸發指定的操作,我的代碼顯示/隱藏導航欄啟動。

我想要的是僅在用戶應用非常短的點擊時才顯示/隱藏導航欄。 如果他們觸摸足夠長的時間讓 WKWebView 選擇文本,我想讓 WKWebView 處理它。

我希望通過觸摸持續時間過濾點擊,但我一直無法找到確定此信息的方法。

我錯過了什么嗎? 我可以使用 UITapGestureRecognizer 來實現這一點,還是需要不同的方法?

我的目標是 iOS 8 和 9。

如果您有權訪問選擇文本的 WKWebView 使用的手勢識別器,那么您可以使用requireGestureRecognizerToFail:設置短按識別器以要求 WKWebView 識別器失敗。

如果您無權訪問 WKWebView 使用的手勢識別器,那么您可以采用這種更黑客的方法:

  1. 創建一個UILongPressGestureRecognizer 這個長按識別器本身不做任何事情,但第 2 步需要它。
  2. 在您的短按識別器中,使用requireGestureRecognizerToFail: ,指定步驟 1 中的UILongPressGestureRecognizer

請注意,如果 WKWebView 在幕后使用UILongPressGestureRecognizer ,則第二種方法只能工作。

對於 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)
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM