Swift:使用自定义字体从HTML创建字符串

时间:2016-07-15 21:17:48

标签: ios swift nsattributedstring

我尝试将来自我后端的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:使用WebViewNSAttributedString,我出于某些原因选择了第二个。我使用以下方法将我的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标签工作的解决方案?

2 个答案:

答案 0 :(得分:3)

在从服务器接收HTML并将其交给属性字符串之前,您可以在HTML中嵌入CSS字体样式。可以使用CSS样式上的字符串插值动态设置字体详细信息。您可以抓取文本视图的字体进行设置。我以前做过这样的事情并且有效,但我并不喜欢它。

答案 1 :(得分:1)

如果“不工作”,你的意思是“强”文本与文本的其余部分使用相同的字体,我认为这只是将字体属性应用于整个字符串的结果 - 它结束覆盖最初由HTML设置的字体属性。我不认为NSAttributedString属性的嵌套方式与它们在HTML中的方式相同。

我不确定为什么属性字符串会首先覆盖textView上的默认字体集。例如,在将AttributedString设置为按钮标题的情况下,我没有看到过。我认为必须是从HTML到属性字符串的转换引入了一些默认的字体属性。

不确定解决此问题的最佳方法是 - 可能在HTML预转换中插入字体样式?否则,我想你可以循环遍历字符串中的属性,并替换/修改任何字体属性,但这看起来很混乱。