4
votes

I use this code to convert a description with HTML Markup into a NSAttributedString.

func attributedStringFromDescription(description: String, withFontName fontName: String) -> NSAttributedString? {
    let attributedOptions : [String: AnyObject] = [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding]
    let betterDescription = "<br><font face=\"\(fontName)\">" + description + "</font>"
    if let encodedData = betterDescription.dataUsingEncoding(NSUTF8StringEncoding) {
        return NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil, error: nil)
    }
    return nil
}

It works well for the font "Helvetica Neue" in iOS8, because the HTML markup I happen to be working with is very basic and doesn't contain any special fonts or links, etc.

Unfortunately, the font name "San Francisco" doesn't work on iOS 9 beta 5, it just uses the default Times New Roman font.

How can I create an attributedString from a description in iOS 9 using the San Francisco Font?

Edit 1:

I've tried replacing better description with

let betterDescription = "<html><head><style type=\"text/css\"> body { font-family: -apple-system; } </style></head><body>" + description + "</body></html>"

but that didn't seem to help either...

1
If you enumerate fonts, do you find the San Francisco font? What's the logs of its name? stackoverflow.com/questions/8090916/fonts-on-ios-deviceLarme
@Larme "San Francisco" is not listed in UIFont.familyNames(), If i inspect UIFont.systemFontOfSize(UIFont.systemFontSize()) on iOS 9 i see ".SFUIText-Regular"Brandon Nott
I didn't check, but you may get more info there: developer.apple.com/fontsLarme

1 Answers

2
votes

Using this code to log the fonts on iOS 9 reveals that you can use .SF UI Text in order to get the new San Francisco font and then you can apply it to your attributed string as well.

    let fontFamily = UIFont.systemFontOfSize(UIFont.systemFontSize()).familyName
    print(fontFamily)

    if let attributedString = attributedStringFromDescription(originalDescription, withFontName: fontFamily) {
        myLabel.attributedText = attributedString
    }