2016-07-15 116 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

是的,就像那樣 –