Wenn ein Benutzer eine Geste zum Tippen und Halten ausführt, um ein Wort auszuwählen, und dann seinen Finger entweder zum oberen oder unteren Rand des Bildschirms zieht, wird die Seite automatisch gescrollt, um die Auswahl anzupassen.
Hier ist ein kurzer Clip, der dies demonstriert
Ich möchte dieses Verhalten in einem verhindern WKWebView
.
Folgendes habe ich bisher versucht:
in einer bridge.js
Datei, auf die die Webansicht zugreifen kann:
var shouldAllowScrolling = true;
document.addEventListener('selectionchange', e => {
shouldAllowScrolling = getSelectedText().length === 0;
window.webkit.messageHandlers.selectionChangeHandler.postMessage(
{
shouldAllowScrolling: shouldAllowScrolling
});
console.log('allow scrolling = ', shouldAllowScrolling);
});
und dann in einer WKScriptMessageHandler
Implementierung:
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)")
}
}
In ähnlicher Weise habe ich versucht, die preventDefault()
Funktion direkt in der Javascript-Datei für eine Reihe von Ereignissen aufzurufen , nämlich scroll
und touchmove
wie folgt:
document.addEventListener('touchmove', e => {
if (!shouldAllowScrolling) {
e.preventDefault()
}
}, {passive: false});
Beide Methoden verhindern erfolgreich das Scrollen, wenn Text ausgewählt ist, überschreiben jedoch nicht das oben ganz oben in meiner Frage beschriebene Verhalten.
Ich kann Lösungen entweder in Swift und JavaScript oder in einer Mischung aus beiden akzeptieren.