Search code examples
htmliosswiftnsattributedstring

set label text NSAttributedString from HTML with font


I'm getting a html text from server and trying to set it to a label with this code

let about = try! NSAttributedString(
                    data: (myHTMLText as! String).data(using: String.Encoding.unicode, allowLossyConversion: true)!,
                    options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
                    documentAttributes: nil)
self.aboutLabel.attributedText = about

but after doing this my labels font is changing to default font. How can I set my font to label without losing attributed parts of text?


Solution

  • I use the following and it works fine for styling a paragraph. If you'd like to style the entire text, then use body tag instead. You can see that the resulting NSAttributedString is styled with the correct font.

    //: Playground - noun: a place where people can play
    
    import UIKit
    
    extension UIFont {
        class func printFontNames() {
            for family in UIFont.familyNames {
                let fonts = UIFont.fontNames(forFamilyName: family)
    
                print("Family: ", family, "Font Names: ", fonts)
            }
        }
    }
    
    UIFont.printFontNames()
    
    
    let paragraphFont = "AvenirNextCondensed-Medium"
    let paragraphSize = 12.0
    let defaultFont = "Helvetica-Bold"
    let defaultSize = 15.0
    
    let htmlStyle = "<style>p {font-family:\(paragraphFont); font-size:\(paragraphSize)px;} body {font-family:\(defaultFont); font-size:\(defaultSize)px;}}</style>"
    
    let htmlText = "<p>Some Paragraph..</p> Some other text"
    let htmlString = "\(htmlStyle)\n\n\(htmlText)"
    
    let html = try! NSAttributedString(data: htmlString.data(using: .utf8)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
    
    print(html)
    

    And the result is:

    Family:  Avenir Next Condensed 
    Font Names:  ["AvenirNextCondensed-BoldItalic", "AvenirNextCondensed-Heavy", "AvenirNextCondensed-Medium", "AvenirNextCondensed-Regular", "AvenirNextCondensed-HeavyItalic", "AvenirNextCondensed-MediumItalic", "AvenirNextCondensed-Italic", "AvenirNextCondensed-UltraLightItalic", "AvenirNextCondensed-UltraLight", "AvenirNextCondensed-DemiBold", "AvenirNextCondensed-Bold", "AvenirNextCondensed-DemiBoldItalic"]
    
    Some Paragraph..
    {
        NSColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
        NSFont = "<UICTFont: 0x7fbd5c706c20> font-family: \"AvenirNextCondensed-Medium\"; font-weight: normal; font-style: normal; font-size: 12.00pt";
        NSKern = 0;
        NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 12, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 17/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n), Lists (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0";
        NSStrokeColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
        NSStrokeWidth = 0;
    }Some other text{
        NSColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
        NSFont = "<UICTFont: 0x7fbd5f203bf0> font-family: \"Helvetica\"; font-weight: bold; font-style: normal; font-size: 15.00pt";
        NSKern = 0;
        NSParagraphStyle = "Alignment 4, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 19/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n), DefaultTabInterval 36, Blocks (\n), Lists (\n), BaseWritingDirection 0, HyphenationFactor 0, TighteningForTruncation NO, HeaderLevel 0";
        NSStrokeColor = "kCGColorSpaceModelRGB 0 0 0 1 ";
        NSStrokeWidth = 0;
    }