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

时间:2018-02-26 08:07:30

标签: html css swift nsattributedstring

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

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>内的文字颜色文本中的标签。

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

如果我将color参数重新设置为样式标记:

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>标记仍然具有每段颜色?

1 个答案:

答案 0 :(得分:1)

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