[英]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 使用的手勢識別器,那么您可以采用這種更黑客的方法:
UILongPressGestureRecognizer
。 這個長按識別器本身不做任何事情,但第 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.