ユーザーがタップアンドホールドジェスチャを実行して単語を選択し、指を画面の上端または下端のいずれかにドラッグすると、選択に対応するためにページが自動的にスクロールします。
内でこの動作を防止したいと思いWKWebView
ます。
これが私がこれまでに試したことです:
内bridge.js
のWebViewにアクセス可能なファイル:
var shouldAllowScrolling = true;
document.addEventListener('selectionchange', e => {
shouldAllowScrolling = getSelectedText().length === 0;
window.webkit.messageHandlers.selectionChangeHandler.postMessage(
{
shouldAllowScrolling: shouldAllowScrolling
});
console.log('allow scrolling = ', shouldAllowScrolling);
});
そしてWKScriptMessageHandler
実装では:
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)")
}
}
同様に、preventDefault()
一連のイベント、つまりscroll
and について、JavaScriptファイルで関数を直接呼び出してみましたtouchmove
。
document.addEventListener('touchmove', e => {
if (!shouldAllowScrolling) {
e.preventDefault()
}
}, {passive: false});
どちらの方法でも、一部のテキストが選択されている場合はスクロールを回避できますが、質問の一番上に記載されている動作はオーバーライドしません。
SwiftとJavaScript、または両方の組み合わせのソリューションを受け入れることができます。