Есть ли способ определить, какой элемент находится в точке в представлении WKWebView или SFSafariViewController? - PullRequest
0 голосов
/ 19 сентября 2018

Я хотел бы знать, какой элемент находится «под» определенной точкой в ​​веб-представлении.Например, на скриншоте ниже я хотел бы знать, какой элемент находится в точке 550x, 275y.Я надеюсь получить результат:

<img alt=​"Typhoon Mangkhut approaching the Philippines on September 14" src=​"/​/​upload.wikimedia.org/​wikipedia/​commons/​thumb/​3/​30/​Mangkhut_2018-09-14_0750Z.jpg/​140px-Mangkhut_2018-09-14_0750Z.jpg" width=​"140" height=​"111" srcset=​"/​/​upload.wikimedia.org/​wikipedia/​commons/​thumb/​3/​30/​Mangkhut_2018-09-14_0750Z.jpg/​210px-Mangkhut_2018-09-14_0750Z.jpg 1.5x, /​/​upload.wikimedia.org/​wikipedia/​commons/​thumb/​3/​30/​Mangkhut_2018-09-14_0750Z.jpg/​280px-Mangkhut_2018-09-14_0750Z.jpg 2x" data-file-width=​"1219" data-file-height=​"963">​

enter image description here

1 Ответ

0 голосов
/ 19 сентября 2018

Если веб-просмотр поддерживает это, вы можете иметь javascript, чтобы определить, что там, и сообщить об этом веб-представлению.Я извиняюсь, но я не запустил этот код, у меня нет средств для его проверки в данный момент.

Если у вас нет возможности добавить JavaScript на страницу, тогда у вас будетчтобы сделать все это в WKWebView .evaluateJavaScript

, найдите значение элемента с помощью:

var elem = document.elementFromPoint(550, 275);

Затем расскажите об этом своему веб-представлению, создав запрос пользовательской схемы.Вы можете сделать это следующим образом:

var iframe = document.createElement("IFRAME");
iframe.setAttribute("src", "customScheme://" + JSON.stringify(elem);
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null;

Перехватить его в делегате веб-просмотра.

public func webView(_ webView: WKWebView,
                    decidePolicyFor navigationAction: WKNavigationAction,
                    decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    let url = navigationAction.request.url
    if(url.range(of:"customScheme://") != nil){
         // this is your reported info
    }
    return true
}

Этот подход покажет вам только элемент, связанный с координатами веб-браузера, а неэто позиция на экране устройства.Если вы хотите сделать это с помощью позиции устройства, вам придется перевести это и передать координаты веб-представлению, вызвав некоторый javascript на устройстве.

...