禁用用户选择WKWebView Swift

时间:2018-01-26 18:49:46

标签: ios swift xcode webview wkwebview

我开发了一个应用程序,它在Swift中使用WKWebView显示一个网页。我需要禁用用户选择和标注(因为网页加载了图表),我找不到任何方法来使用WKWebView。

这是我的代码:

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!


    override func viewDidLoad() {
        super.viewDidLoad()

        let url = URL(string: "https://danfg95glucose.azurewebsites.net")
        let request = URLRequest(url: url!)
        webView.navigationDelegate = self
        webView.load(request)

    }
}

我想做一些类似的事情,但在Swift中使用WKWebView:

// Disable user selection
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
// Disable callout
[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];

有可能吗?

这是显示问题的图片:enter image description here

非常感谢您的回复。抱歉我的水平,我是新的,我正在学习编程。

4 个答案:

答案 0 :(得分:3)

您正在寻找的是以编程方式向您的WKWebView添加this css。

首先,在视图控制器上添加WKWebView:

getDerivedStateFromProps(nextProps, prevState)

然后,实现导航委托方法

let webViewConfiguration = WKWebViewConfiguration()
let webView = WKWebView(frame: .zero, configuration: webViewConfiguration)
view.addSubview(webView)
webView.snp.updateConstraints { make in
    make.edges.equalTo(view)
}

webView.navigationDelegate = self
webView.load(URLRequest(url: URL(string: "https://www.google.com")!))

在里面加上这个:

optional public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)

这样,您将以编程方式添加样式标记,并使用禁用标注的css。

希望它有所帮助!

答案 1 :(得分:1)

这将停止所有用户互动:

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
        // if button allows interaction:
           decisionHandler(.allow)
        // if button does not allow interaction:
           decisionHandler(.cancel)
    }

这是WKNavigationDelegate函数。

答案 2 :(得分:0)

在您的页面上添加此内容。一个会停用整个页面的选择,并且只能在INPUT中启用

<style type="text/css">
    input[type=text], input[type=password], input[type=email], input[type=number], input[type=time], input[type=date], textarea {
        /* on selection */
        -webkit-touch-callout: auto;
        -webkit-user-select: auto;
    }
    * {
        /* off selection */
        -webkit-touch-callout: none;
        -webkit-user-select: none;
    }

</style>

答案 3 :(得分:0)

Joel Marquez的答案是正确的,但是我想补充一点,您可以使用WKUserContentController代替委托方法:

    let selectionString = "var css = '*{-webkit-touch-callout:none;-webkit-user-select:none}';"
        + " var head = document.head || document.getElementsByTagName('head')[0];"
        + " var style = document.createElement('style'); style.type = 'text/css';" +
        " style.appendChild(document.createTextNode(css)); head.appendChild(style);"
    let selectionScript: WKUserScript = WKUserScript(source: selectionString, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
    webView.configuration.userContentController.addUserScript(selectionScript)