我尝试将来自我后端的HTML字符串转换为NSAttributedString
textView
,,但我想自己设置字体。
以下是来自我的服务器的HTML-String示例:
<p><strong>Title</strong></p> <p><strong>Extra info ..</strong></p><p>- Some more info</p> <p>- Contact</p>
有些stackoverflow主题建议在服务器后端设置字体,但在我的情况下这是不可能的。
我在线搜索了如何创建NSAtrributedString
:使用WebView
或NSAttributedString
,我出于某些原因选择了第二个。我使用以下方法将我的HTML-String转换为NSAttributedString:
func setHTMLFromString() -> NSAttributedString{
let attrStr = try! NSMutableAttributedString(
data: self.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil)
return attrStr
}
此方法有效,但它会覆盖我为textView设置的默认系统字体。所以我尝试将字体添加为属性:
func setHTMLFromString() -> NSAttributedString{
let attrStr = try! NSMutableAttributedString(
data: self.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil)
if #available(iOS 8.2, *) {
attrStr.addAttributes([NSFontAttributeName : UIFont.systemFontOfSize(16.0, weight: UIFontWeightThin),
NSForegroundColorAttributeName: UIColor(rgb: 0x555555)], range: NSMakeRange(0, attrStr.length))
} else {
attrStr.addAttributes([NSFontAttributeName : UIFont.systemFontOfSize(16.0),
NSForegroundColorAttributeName: UIColor(rgb: 0x555555)], range: NSMakeRange(0, attrStr.length))
}
return attrStr
}
现在我要显示的字体显示正确,但所有HTML标记都停止工作。任何人都有一个如何设置字体和保持HTML标签工作的解决方案?
答案 0 :(得分:3)
在从服务器接收HTML并将其交给属性字符串之前,您可以在HTML中嵌入CSS字体样式。可以使用CSS样式上的字符串插值动态设置字体详细信息。您可以抓取文本视图的字体进行设置。我以前做过这样的事情并且有效,但我并不喜欢它。
答案 1 :(得分:1)
如果“不工作”,你的意思是“强”文本与文本的其余部分使用相同的字体,我认为这只是将字体属性应用于整个字符串的结果 - 它结束覆盖最初由HTML设置的字体属性。我不认为NSAttributedString属性的嵌套方式与它们在HTML中的方式相同。
我不确定为什么属性字符串会首先覆盖textView上的默认字体集。例如,在将AttributedString设置为按钮标题的情况下,我没有看到过。我认为必须是从HTML到属性字符串的转换引入了一些默认的字体属性。
不确定解决此问题的最佳方法是 - 可能在HTML预转换中插入字体样式?否则,我想你可以循环遍历字符串中的属性,并替换/修改任何字体属性,但这看起来很混乱。