Не может обрабатывать касания одновременно с WKWebView на iOS 13,4 - PullRequest
1 голос
/ 14 апреля 2020

Проблема: Начиная с 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 раз не работал.

...