如何捕获 WKWebView 忽略的点击

How to capture taps ignored by WKWebView

我有一个包含 WKWebView 的视图。我的 html 内容是由我的应用程序生成的,所以我确定它永远不会比屏幕宽,所以我在其超级视图上使用 UIGestureRecognizers 来对左右滑动做出反应。效果很好。

我还希望看到任何不在 link 上的水龙头,这样我就可以决定我可能想对这些水龙头做什么。看起来 WKWebView 吸收了所有的水龙头。我试着向它询问它的手势识别器数组,以便我可以与他们建立一些合作关系,但无论我什么时候询问(即在创建 WKWebView 之后,在用我的 [=24= 加载它之后),我都得到 nil ] 文件,并在通知它已完成加载时)。如果 WKWebView 没有使用 UIGestureRecognizer 机制,而是只是观察点击,如果发现它对点击不感兴趣,则不传递它们。

关于获取 WKWebView 不需要的点击的任何想法?

原来解决这个问题的方法是把问题从里到外。我在 WKWebView 上放了一个透明的 UIView,并在我的透明视图上附加了几个 UIGestureRecognizer。我使用 JavaScript 调用来响应平移手势。当在我的透明视图上识别出点击时,我查询 DOM 以查看它是否是 link,如果不是,我可以用它做任何我想做的事。另一个好处是我可以处理长按,这是我想做的事情,而不是让 WKWebView 执行其固有的、不可更改的行为。这真的很好用。

Swift 3.0 工作解决方案,应该以相同的方式与 Obj-C 一起工作(尚未测试)

...

let gesture = UITapGestureRecognizer(target: self, 
                                     action: #selector(gotTap(gesture:))
)
gesture.delegate = self
self.webView?.scrollView.addGestureRecognizer(gesture)

...

func gotTap(gesture:UITapGestureRecognizer) {
    print("gotTap")
//    self.webView?.scrollView.removeGestureRecognizer(gesture)
}

// MARK: UIGestureRecognizerDelegate method
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                       shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}