Quando um usuário toca e mantém pressionado o gesto para selecionar uma palavra e, em seguida, arrasta o dedo na direção da borda superior ou inferior da tela, a página rola automaticamente para acomodar a seleção.
aqui está um pequeno clipe demonstrando
Eu gostaria de evitar esse comportamento dentro de um WKWebView
.
Aqui está o que eu tentei até agora:
em um bridge.js
arquivo acessível para a visualização na web:
var shouldAllowScrolling = true;
document.addEventListener('selectionchange', e => {
shouldAllowScrolling = getSelectedText().length === 0;
window.webkit.messageHandlers.selectionChangeHandler.postMessage(
{
shouldAllowScrolling: shouldAllowScrolling
});
console.log('allow scrolling = ', shouldAllowScrolling);
});
e depois em uma WKScriptMessageHandler
implementação:
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)")
}
}
Da mesma forma, tentei chamar a preventDefault()
função diretamente no arquivo javascript para vários eventos, a saber , scroll
e touchmove
assim:
document.addEventListener('touchmove', e => {
if (!shouldAllowScrolling) {
e.preventDefault()
}
}, {passive: false});
ambos os métodos impedem a rolagem com êxito quando algum texto é selecionado, mas não substituem o comportamento descrito na parte superior da minha pergunta.
Posso aceitar soluções em Swift e JavaScript ou uma mistura de ambas.