WKWebView:无法更改字体大小

时间:2018-03-07 13:50:13

标签: ios swift wkwebview

问题

我正在尝试调整WKWebView中显示的文本/内容的大小。内容本身是从远程源(通过loadHTMLString)加载的,因此我无法更改CSS。

我已经尝试了大多数其他可以在堆栈溢出上找到的解决方案(例如https://stackoverflow.com/a/43694902/1673377),但似乎都没有。

一些背景

Xcode 9.2,Swift 4,iOS 10/11。

为了监控内容大小,我使用了从这里获取的代码:https://stackoverflow.com/a/41511422/1673377

lazy var webView: WKWebView = {
    //Javascript string
    let source = "window.onload=function () {window.webkit.messageHandlers.sizeNotification.postMessage({justLoaded:true,height: document.body.scrollHeight});};"
    let source2 = "document.body.addEventListener( 'resize', incrementCounter); function incrementCounter() {window.webkit.messageHandlers.sizeNotification.postMessage({height: document.body.scrollHeight});};"

    //UserScript object
    let script = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: true)

    let script2 = WKUserScript(source: source2, injectionTime: .atDocumentEnd, forMainFrameOnly: true)

    //Content Controller object
    let controller = WKUserContentController()

    //Add script to controller
    controller.addUserScript(script)
    controller.addUserScript(script2)

    //Add message handler reference
    controller.add(self, name: "sizeNotification")

    //Create configuration
    let configuration = WKWebViewConfiguration()
    configuration.userContentController = controller

    return WKWebView(frame: CGRect.zero, configuration: configuration)
}()

要禁用缩放,我还会评估以下JavaScript:

"var meta = document.createElement('meta');meta.setAttribute('name', 'viewport');meta.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no');document.getElementsByTagName('head')[0].appendChild(meta);"

(我尝试使用initial-scalemaximum-scale的值,但无济于事。)

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:6)

基本目标

如果你想改变字体大小,你需要一些CSS。因此,您的目标应该是在html标题中的某处注入以下2行:

<link rel='stylesheet' href='style.css' type='text/css'>
<meta name='viewport' content='initial-scale=1.0'/> // This may help with scale

如果您向项目添加style.css文件,现在应该尊重它。

实际实施

我不知道您从服务器收到的html是如何配置的,但是在将其加载到WKWebView之前,您可以尝试稍微操纵它:

let customHeader = <link rel='stylesheet' href='style.css' type='text/css'><meta name='viewport' content='initial-scale=1.0'/>
let newHtml = serverHtml.replacingOccurrences(of: "<head>", with: "<head>" + customHeader)