WKWebView禁止UIMenuController

在移动应用的开发中,不可避免的会使用到HTML页面,在iOS的开发中,用来展示网页的一般是UIWebView,在iOS 8.0之后,Apple提供了一个新的框架(WKWebView),两个都是用来展示网页的,但是部分使用方法是有差别的。

WKWebView在长按网页中的元素的时候,系统会自动弹出UIMenuController,如果是元素是文字,展示样式如下:


WKWebView禁止UIMenuController_第1张图片
longPressText.jpg

如果长按的元素是图片,展示的样式如下:


WKWebView禁止UIMenuController_第2张图片
longPressImage.jpg

这种确实很方便,尤其是在展示第三方的页面时,看到像保存的图片可以直接保存。但是,如果是自己的网页,长按时需要做其他的事情,就不能弹出UIMenuController了。

在WKWebView中,没有直接禁止的属性设置,需要注入JS进行禁止。

1. 先创建一个方法,用来创建一个WKUserContentController对象
private func creatMenuDisable() -> WKUserContentController {
    /// 禁止选择CSS
    let css = "body{-webkit-user-select:none;-webkit-user-drag:none;}"
        
    /// CSS选中样式取消
    var jsStr = "var style = document.createElement('style');"
    jsStr.append("style.type = 'text/css';")
    jsStr.append("var cssContent = document.createTextNode('\(css)');")
    jsStr.append("style.appendChild(cssContent);")
    jsStr.append("document.body.appendChild(style);")
    jsStr.append("document.documentElement.style.webkitUserSelect='none';") /// 禁止选择
    jsStr.append("document.documentElement.style.webkitTouchCallout='none';") /// 禁止长按
        
    let noneSelectScript = WKUserScript.init(source: jsStr, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: true)
    let userContentController = WKUserContentController.init()
    userContentController.addUserScript(noneSelectScript)
    return userContentController
}
2. 创建WKWebView的配置对象
let conf = WKWebViewConfiguration.init()
conf.userContentController = creatMenuDisable()
3. 创建WKWebView对象
let mainWkWebView = WKWebView.init(frame: .init(origin: .init()), configuration: conf)

之后再使用这个对象,在长按图片或其他元素的时候,不会弹出UIMenuController,如果你想在图片上增加被的长按事件,可以让前端去做,也可以自己手动给网页增加长按手势。

你可能感兴趣的:(WKWebView禁止UIMenuController)