Cuando un usuario realiza un gesto de tocar y mantener presionado para seleccionar una palabra y luego arrastra el dedo hacia los bordes superior o inferior de la pantalla, la página se desplaza automáticamente para acomodar la selección.
aquí hay un breve clip que lo demuestra
Me gustaría evitar este comportamiento dentro de a WKWebView
.
Esto es lo que he intentado hasta ahora:
en un bridge.js
archivo accesible para la vista web:
var shouldAllowScrolling = true;
document.addEventListener('selectionchange', e => {
shouldAllowScrolling = getSelectedText().length === 0;
window.webkit.messageHandlers.selectionChangeHandler.postMessage(
{
shouldAllowScrolling: shouldAllowScrolling
});
console.log('allow scrolling = ', shouldAllowScrolling);
});
y luego en una WKScriptMessageHandler
implementación:
public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
{
switch message.name
{
case "selectionChangeHandler":
let params = paramsDictionary(fromMessageBody: message.body)
let shouldEnableScrolling = params["shouldAllowScrolling"] as? Bool ?? true
cell?.webView.scrollView.isScrollEnabled = shouldEnableScrolling
cell?.webView.scrollView.isUserInteractionEnabled = shouldEnableScrolling // not together with the line above
default:
fatalError("\(#function): received undefined message handler name: \(message.name)")
}
}
Del mismo modo, he intentado llamar a la preventDefault()
función directamente en el archivo javascript para varios eventos, a saber , scroll
y touchmove
así:
document.addEventListener('touchmove', e => {
if (!shouldAllowScrolling) {
e.preventDefault()
}
}, {passive: false});
ambos métodos evitan con éxito el desplazamiento cuando se selecciona algún texto, pero no anulan el comportamiento descrito en la parte superior de mi pregunta.
Puedo aceptar soluciones en Swift y JavaScript o una combinación de ambos.