Проблема: Начиная с 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)
.
Когда я запускал этот код 10 раз на iOS 13.0 Simulator, каждый раз, когда работал мой обработчик. Когда я 10 раз запускал этот код на симуляторе iOS 13.4, мой обработчик пинча работал 4 раза и 6 раз не работал.