WKCompositingView 会阻止触摸吗?

Posted

技术标签:

【中文标题】WKCompositingView 会阻止触摸吗?【英文标题】:is WKCompositingView blocking touches? 【发布时间】:2017-06-14 00:48:23 【问题描述】:

我有一个想要处理触摸的 WKWebView,但我找不到正确的方法。

webView 是在 viewDidLoad 中以编程方式创建的,并且可以正常加载。

override func viewDidLoad() 
    super.viewDidLoad()
    let site = "http://google.com"
    let url = URL(string: site)
    let request = URLRequest(url: url!)
    webView = WKWebView(frame: self.view.frame)
    webView.navigationDelegate = self
    webView.uiDelegate = self // is this necessary for UITouch recognition?
    webView.load(request)
    self.view.addSubview(webView)

我尝试在 viewDidLoad 中添加 UITapGestureRecognizer...(根据 UIWebView and touch event)

override func viewDidLoad() 
    //...
    let taprecognizer = UITapGestureRecognizer(target: self, action: #selector(tapLocation))
    taprecognizer.numberOfTapsRequired = 1
    taprecognizer.delegate = self
    webView.addGestureRecognizer(taprecognizer)


func tapLocation(recognizer: UITapGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool 
    print("tapped")
    return true

我也尝试过与...取得联系

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
    print("tapped")

我的 Debug View Hierarchy 显示了一堆 WKCompositingViews,这让我觉得它们在到达 WKWebView 或 View 之前就已经使用了触摸。

我已将 UIViewController、UIWebViewDelegate、WKNavigationDelegate、WKUIDelegate、UIGestureRecognizerDelegate 添加到类...但它就是不会通过。

【问题讨论】:

你能解决这个问题吗? 您的意思是要在WKWebView 中处理触摸还是要在WebView 中处理链接? @Superman 我试图处理在WKWebview 范围内发生的触摸。我相信我这样做是为了使用链接,但我学会了使用evaluatejavascript,所以我仍然找到了解决这个问题的方法。 你是如何用 evaluateJavaScript 解决这个问题的? @RobertVeringa 我解决了我的目标。不是这个问题。 【参考方案1】:

这是一个示例工作代码,其中我将 WKWebView 添加到主视图中,并且我能够使用 UIGestureRecognizerDelegate 检测 WKWebView 触摸事件

Swift4

    //
    //  WebViewVC.swift
    //
    //  Created by Test user on 01/02/18.
    //  Copyright © 2018 Test user. All rights reserved.
    //

    import UIKit
    import WebKit

    class WebViewVC: UIViewController,WKUIDelegate,UIGestureRecognizerDelegate 

        var webView : WKWebView!

        override func viewDidLoad() 
            super.viewDidLoad()
            let site = "http://google.com"
            let url = URL(string: site)
            let request = URLRequest(url: url!)
            webView = WKWebView(frame: self.view.frame)
            webView.uiDelegate = self // is this necessary for UITouch recognition?
            webView.load(request)
            self.view.addSubview(webView)

            let taprecognizer = UITapGestureRecognizer(target: self, action: #selector(tapLocation))
            taprecognizer.numberOfTapsRequired = 1
            taprecognizer.numberOfTouchesRequired = 1
            taprecognizer.delegate = self
            webView.addGestureRecognizer(taprecognizer)
        

        @objc func tapLocation(recognizer: UITapGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool 
            print("tapped")
            return true
        

        func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool 
            print("Tap event will detect here.")
            return true
        

    

【讨论】:

以上是关于WKCompositingView 会阻止触摸吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UIView 的这些自动布局约束会阻止 UIButton 子视图接收触摸事件?

阻止 ViewController 拦截触摸

如何阻止 ExpandableListView 窃取子触摸事件?

UITapGestureRecognizer 在子视图中阻止 UIButton 的触摸事件

手势识别器阻止触摸已结束

如何防止 UILabel 在 Swift 中阻止对父 UIButton 的触摸?