gpt4 book ai didi

swift - 无法在 iOS 13.4 上与 WKWebView 同时处理触摸

转载 作者:行者123 更新时间:2023-12-03 09:25:56 30 4
gpt4 key购买 nike

问题:
从 iOS 13.4 开始,WebKit 会拦截之前传递给系统的手势,可以由 UIGestureRecognizer 处理。同时

演示项目:
我创建了 WKWebView并将其添加到 UIViewController的观点。我也创建了 UIPinchGestureRecognizer并将其添加到 UIViewControler的观点也是如此。

class ViewController: UIViewController, UIGestureRecognizerDelegate, WKNavigationDelegate {

var webView: WKWebView?

override func viewDidLoad() {
super.viewDidLoad()

let pinch = UIPinchGestureRecognizer(target: self, action: #selector(self.pinchHandler))
pinch.delegate = self
self.view.addGestureRecognizer(pinch)

addWebView()
}

func addWebView() {
let webView = WKWebView()
webView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(webView)
NSLayoutConstraint.activate([
webView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
webView.topAnchor.constraint(equalTo: view.topAnchor),
webView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
webView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])

self.webView = webView
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if let localHtmlFile = Bundle.main.url(forResource: "index", withExtension: "html") {
let request = URLRequest(url: localHtmlFile)
webView?.load(request)
}
}

@objc func pinchHandler() {
debugPrint("PinchHandler called")
}

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

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive event: UIEvent) -> Bool {
if event.type == .touches {
return true
}
return false
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return true
}
}

我尝试运行添加到主包的示例 html 网站:
<html>
<head>
<style>
.center {
width: 100%;
height: 100%;
border: 3px solid #73AD21;
text-align: center;
font-size: 100;
overflow: hidden;
}
</style>
<script>
function move(event) {
console.log(event);
event.preventDefault()
}
</script>
</head>

<body ontouchmove="move(event)" class="center">
<p id="content">
demo
</p>
</body
</html>

网站拦截 touchmove事件,我将在 move(event) 中取消它功能。

当我在 iOS 13.0 Simulator 上运行此代码 10 次时,每次我的处理程序都有效。当我在 iOS 13.4 Simulator 上运行此代码 10 次时,我的捏合处理程序工作了 4 次,但没有工作 6 次。

最佳答案

我最终切换到使用 Javascript 来检测 webview 上的点击。
一个正在运行的操场展示了如何做到这一点:

import UIKit
import PlaygroundSupport
import WebKit

class TouchDetectionOnWKWebViewUsingJSDemoVC : UIViewController, WKScriptMessageHandler {
override func loadView() {
let config = WKWebViewConfiguration()
let webView = WKWebView(frame: .init(origin: .zero, size: .init(width: 100, height: 200)), configuration: config)

let jsEvent = "touchstart"
let handlerName = "handler"
let jsCode =
"""
window.addEventListener('\(jsEvent)', function(e) {
window.webkit.messageHandlers.\(handlerName).postMessage('\(jsEvent)')
})
"""

let jsScript = WKUserScript(source: jsCode, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
config.userContentController.addUserScript(jsScript)
config.userContentController.add(self, name: handlerName)

let demoURL = URL(string: "https://developer.apple.com/")!
webView.load(URLRequest(url: demoURL))

self.view = webView
}

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print(message.body)
}
}

PlaygroundPage.current.liveView = TouchDetectionOnWKWebViewUsingJSDemoVC()
在示例中,我展示了如何监听 touchstart事件,但它可以是任何 js 事件,例如: touchend , touchmove , gesturestart , gestureend , 和别的。我们甚至可以监听滚动事件(但我认为最好成为 webView.scrollView 代表)。

关于swift - 无法在 iOS 13.4 上与 WKWebView 同时处理触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61208881/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com