WKWebView通过EvaluationJavaScript()函数插入自定义字体

时间:2019-08-07 12:05:50

标签: wkwebview custom-font

我正在使用WKWebView呈现一些本地HTML。我使用WKNavigationDelegate的webView(_ webView:WKWebView,didFinish导航:WKNavigation!){}方法来声明我制作的包含布局更新的JS字符串。

我通过一个中间对象提供了此字符串,该对象从应用程序中的自定义标签获取布局参数。

一切都很好,但是花哨的:当我向混合中添加自定义字体(或任何本机字体)时,所有内容都会崩溃。

我尝试将以下所示的字符串添加到字符串中。但是,我的HTML经验非常有限,我可能会盯着一些非常明显的问题。看起来像这样;

{ font-family: 'SOME_FONT';src: local('SOME_FONT'),url('SOME_FONT.otf') format('opentype'); ...rest of the values}

我尝试使用@font-face;

我尝试在getCSSStringVariables返回字符串的开头提供此代码:

任何人都可以向我解释如何执行此操作,而无需在实际HTML的标题中提供样式。 这是一个类,用于创建由WKWebView评估的请求的js字符串


open class CSSLayoutObject {
    typealias Label = UILabel
    typealias FontFamily_FontName_Size_LineHeight_Color = (String, String, CGFloat, CGFloat, String)


    public func body<Label: UILabel>(label : Label? = nil) -> String {
        let cssString = "body \(getCSSStringVariables(label: label))"
        let jsString = "var style = document.createElement('style'); style.innerHTML = '\(cssString)'; document.head.appendChild(style);"
        return jsString
    }

    public func paragraph<Label: UILabel>(label : Label? = nil) -> String {
        let cssString = "paragraph \(getCSSStringVariables(label: label))"
        let jsString = "var style = document.createElement('style'); style.innerHTML = '\(cssString)'; document.head.appendChild(style);"
        return jsString
    }

    private func getCSSStringVariables(label : Label?) -> String {
        let label = (label == nil ?  UILabelBody() : label)!
        let (fontFamily, fontName, size, height, color ) = getLabelStyling(label)
        return "{ font-size: \(size)px; color: #\(color); }"   // < ------ THIS IS THE STRING IN QUESTION
    }

    private func getLabelStyling(_ label : Label) -> FontFamily_FontName_Size_LineHeight_Color {

        var font = label.font!
        font = UIFont(name: "OpenSans-Semibold", size: 60)!
        let fontFamily = font.familyName
        let fontName = font.fontName
        let fontSize = font.pointSize
        let fontLineHeight = font.lineHeight
        var fontColor = label.textColor!
        fontColor = UIColor.yellow
        return (fontFamily, fontName, fontSize, fontLineHeight, fontColor.toHex()!)
    }
}

只要我不提及该变量:font-family就可以了

0 个答案:

没有答案