在移动应用的开发中,不可避免的会使用到HTML页面,在iOS的开发中,用来展示网页的一般是UIWebView,在iOS 8.0之后,Apple提供了一个新的框架(WKWebView),两个都是用来展示网页的,但是部分使用方法是有差别的。
WKWebView在长按网页中的元素的时候,系统会自动弹出UIMenuController,如果是元素是文字,展示样式如下:
如果长按的元素是图片,展示的样式如下:
这种确实很方便,尤其是在展示第三方的页面时,看到像保存的图片可以直接保存。但是,如果是自己的网页,长按时需要做其他的事情,就不能弹出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,如果你想在图片上增加被的长按事件,可以让前端去做,也可以自己手动给网页增加长按手势。