【问题标题】:Swift: Create String from HTML with custom fontSwift:使用自定义字体从 HTML 创建字符串
【发布时间】:2016-07-16 06:11:15
【问题描述】:

我正在尝试将来自后端的 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:使用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 标签工作的解决方案?

【问题讨论】:

    标签: ios swift nsattributedstring


    【解决方案1】:

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

    【讨论】:

    • 在获得的 HTML 中嵌入 CSS 应该是可能的,但是这感觉“脏”。我真的想知道是否没有像 Android 那样更好/更简单的方法,其中有一个原生 HTML 类来完成所有工作。我会等一下这个话题,如果没有给出其他答案,我会接受这个答案,因为它确实可以解决问题。
    • @Hapeki 完全同意这种感觉“肮脏”。如果你想出更好的方法,我会很感兴趣。
    【解决方案2】:

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

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

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

    【讨论】:

    猜你喜欢
    • 2014-10-13
    • 2014-12-03
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多