在 WKWebView 上禁用 link 拖动
Disable link drag on WKWebView
我使用的是 Xcode 和 Swift 的最新版本。我正在使用以编程方式创建的 WKWebView。
如果我点击 link,稍等一下,然后移动我的手指,我可以拖动(然后放下)一个带有 link 标题和 link本身。
澄清一下:我不是指强制触摸,它会显示 link 预览和一些操作,例如 Ad link to reading list
。
如何禁用拖动 link 行为?
我在这里找到了解决方案:
这是我的工作代码:
private func disableDragAndDropInteraction() {
var webScrollView: UIView? = nil
var contentView: UIView? = nil
if #available(iOS 11.0, *) {
guard let noDragWebView = webView else { return }
webScrollView = noDragWebView.subviews.compactMap { [=10=] as? UIScrollView }.first
contentView = webScrollView?.subviews.first(where: { [=10=].interactions.count > 1 })
guard let dragInteraction = (contentView?.interactions.compactMap { [=10=] as? UIDragInteraction }.first) else { return }
contentView?.removeInteraction(dragInteraction)
}
}
override func viewDidAppear(_ animated: Bool) {
disableDragAndDropInteraction()
}
您还必须在初始化 WKWebView
后添加 disableDragAndDropInteraction()
,例如在 viewDidLoad()
.
如果你控制了 HTML 加载到 WKWebView,你可以使用 CSS 属性 webkit-touch-callout
像:
img, a {
-webkit-touch-callout: none;
}
您还需要将元素的 draggable
属性设置为 false
,例如:
<img ... draggable="false">
我想您也可以使用 -[WKWebView evaluateJavaScript(...)]
和 family 来注入这些修改。
这将避免依赖脆弱的子视图潜水和操作。
从 iOS 15.3 开始测试。
我使用的是 Xcode 和 Swift 的最新版本。我正在使用以编程方式创建的 WKWebView。
如果我点击 link,稍等一下,然后移动我的手指,我可以拖动(然后放下)一个带有 link 标题和 link本身。
澄清一下:我不是指强制触摸,它会显示 link 预览和一些操作,例如 Ad link to reading list
。
如何禁用拖动 link 行为?
我在这里找到了解决方案:
这是我的工作代码:
private func disableDragAndDropInteraction() {
var webScrollView: UIView? = nil
var contentView: UIView? = nil
if #available(iOS 11.0, *) {
guard let noDragWebView = webView else { return }
webScrollView = noDragWebView.subviews.compactMap { [=10=] as? UIScrollView }.first
contentView = webScrollView?.subviews.first(where: { [=10=].interactions.count > 1 })
guard let dragInteraction = (contentView?.interactions.compactMap { [=10=] as? UIDragInteraction }.first) else { return }
contentView?.removeInteraction(dragInteraction)
}
}
override func viewDidAppear(_ animated: Bool) {
disableDragAndDropInteraction()
}
您还必须在初始化 WKWebView
后添加 disableDragAndDropInteraction()
,例如在 viewDidLoad()
.
如果你控制了 HTML 加载到 WKWebView,你可以使用 CSS 属性 webkit-touch-callout
像:
img, a {
-webkit-touch-callout: none;
}
您还需要将元素的 draggable
属性设置为 false
,例如:
<img ... draggable="false">
我想您也可以使用 -[WKWebView evaluateJavaScript(...)]
和 family 来注入这些修改。
这将避免依赖脆弱的子视图潜水和操作。
从 iOS 15.3 开始测试。