NSAttribtuedStringt 来自 HTML,覆盖默认文本颜色
NSAttribtuedStringt From HTML, Override Default Text Color
我正在从服务器获取一些 HTML 样式的文本,我需要将其显示为 UILabel
或 UITextView
的属性文本。
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>
我正在从服务器获取一些 HTML 样式的文本,我需要将其显示为 UILabel
或 UITextView
的属性文本。
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>