NSAttribtuedStringt 来自 HTML,覆盖默认文本颜色

NSAttribtuedStringt From HTML, Override Default Text Color

我正在从服务器获取一些 HTML 样式的文本,我需要将其显示为 UILabelUITextView 的属性文本。

html 可能包含简单的 <em><b><u> 标签,以及为文本部分指定不同颜色的 <font> 标签.

首先,我采用了一种简单的方法,将 HTML 字符串转换为数据并使用它来适当地初始化 NSAttributedString,使用 init(data:options:documentAttributes:).

这按预期工作,只是它将文本视图的字体覆盖为一些看起来非常小的 Times New Roman。

根据在 this blog post 上找到的代码,我决定在整个内容前添加一个样式标签,以便我可以设置默认字体系列和磅值:

func htmlAttributed(family: String?, size: CGFloat) -> NSAttributedString? {

    do {
        let htmlCSSString = "<style>" +
            "html *" +
            "{" +
            "font-size: \(size)pt !important;" +
            "font-family: \(family ?? "Helvetica"), Helvetica !important;" +
        "}</style> \(self)"

        guard let data = htmlCSSString.data(using: String.Encoding.utf8) else {
            return nil
        }

        return try NSAttributedString(
            data: data,
            options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue],
            documentAttributes: nil)
    } catch {
        print(error.localizedDescription)
        return nil
    }
}

原始代码有一个额外的参数来指定前置 <style> 标签中的 文本颜色 ,但我删除了它,因为我的 html 内容指定文本中单独 <font> 个标签内的文本颜色。

这样就完成了工作,但我还有一个问题:文本的默认颜色呈现为黑色,我需要它是更浅的灰色阴影。

如果我将颜色参数重新设置为样式标签:

let htmlCSSString = "<style>" +
            "html *" +
            "{" +
            "font-size: \(size)pt !important;" +
            "color: #\(color.hexString) !important;" + // <- THIS
            "font-family: \(family ?? "Helvetica"), Helvetica !important;" +
        "}</style> \(self)"

然后整个文本得到相同的颜色,内联标签如:

<font color="FF0000">red text</font>

被忽略。


如何指定不同于黑色的默认颜色,并使用 <font> 标签仍​​然具有每段颜色?

从代码中删除 !important 并将 <font> 标记替换为 <span>