2016-07-15 73 views
1

我试图将来自我的后端的HTML字符串转换为NSAttributedString,用于我的textView,,但我想要自己设置字体Swift:使用自定义字体从HTML创建字符串

这里是一个HTML字符串从我的服务器来的例子:

<p><strong>Title</strong></p> <p><strong>Extra info ..</strong></p><p>- Some more info</p> <p>- Contact</p> 

一些计算器主题建议设置在服务器后端的字体,但是这是不可能在我的处境。

我在网上搜索关于如何创建NSAtrributedString:使用WebViewNSAttributedString,我去与第二出于某些原因。我用下面的方法来我的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标签工作的解决方案?

回答

3

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

+1

在获得的HTML中嵌入CSS应该是可能的,但是这会感觉“脏”。我真的不知道是否没有像Android这样的更好/更简单的方法,其中有一个原生的HTML类来完成所有的工作。我会稍微等待这个话题,如果没有其他答案给出,我会接受这个答案,因为它确实有效。 – Hapeki

+0

@Hapeki完全同意它感觉“脏”。如果你想出一个更好的方法,我会很感兴趣。 –

1

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

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

不知道解决这个问题的最好方法是 - 可能会在HTML预转换中插入字体样式?否则,我想你可以遍历字符串中的属性,并替换/修改任何字体属性,但这似乎很混乱。

+0

通过添加字体样式我假设你的意思是插入字符串的方式,它包含HTML字符串中的字体? 例如: http://stackoverflow.com/a/24653632/6414904 – Hapeki

+0

是的,就像那样 –