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

4
我想将来自我的后端的HTML字符串转换为NSAttributedString,并将其应用于我的textView,但我希望能够自己设置字体。 下面是来自服务器的HTML字符串示例:
<p><strong>Title</strong></p> <p><strong>Extra info ..</strong></p><p>- Some more info</p> <p>- Contact</p>

有些stackoverflow的主题建议在服务器后端设置字体,但在我这种情况下不可能。

我在网上搜索如何创建 NSAtrributedString :使用 WebView NSAttributedString ,出于某些原因我选择了第二个。 我使用以下方法将我的HTML字符串转换为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个回答

3

在从服务器接收到HTML并将其交给属性字符串之前,您可以在HTML中嵌入CSS字体样式。使用CSS样式上的字符串插值可以动态设置字体细节。您可以获取文本视图的字体进行设置。我以前做过类似的事情,它可以工作,但我真的不是很喜欢它。


2
嵌入CSS到获取的HTML中是可行的,但这样做感觉有点"不干净"。我真的很想知道是否有更好/更简单的方法,就像在Android中有一个原生的HTML类来完成所有工作一样。我会稍等一下这个话题,如果没有其他答案,我会接受这个答案,因为它确实能解决问题。 - Hapeki
@Hapeki 完全同意这种感觉很“肮脏”。如果你有更好的方法,我会很感兴趣。 - Matt Long

1
如果您所说的“不起作用”是指“强调”文本与其他文本具有相同的字体,我认为这只是将字体属性应用于整个字符串的结果 - 它最终会覆盖HTML最初设置的字体属性。我认为NSAttributedString属性不能像在HTML中那样嵌套。
但我不确定为什么带属性的字符串会首先覆盖textView上设置的默认字体。例如,我没有在将AttributedString设置为按钮标题时看到过这种情况。我想这一定是从HTML转换为带属性的字符串时引入了一些默认的字体属性。
不确定修复此问题的最佳方法是什么 - 或许可以在HTML预转换中插入一个字体样式?否则,我想您可以循环遍历字符串中的属性,并替换/修改任何字体属性,但这似乎很混乱。

通过添加字体样式,我认为您的意思是以这种方式插值字符串,使其在HTML字符串中包含字体?例如:https://dev59.com/L2Ij5IYBdhLWcg3wwHpr#24653632 - Hapeki
是的,就像那样。 - Mark Bessey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接