2015-10-28 2 views
4

Мне нужно проанализировать основные строки HTML, содержащие <b> (полужирный), <i> (курсив) и <u> (подчеркивание) тегов, ничего более, просто эти простые теги.Разбирайте HTML в NSAttributedString с шрифтом Сан-Франциско? (iOS 9)

Сейчас я могу получить только теги <u> (нужное подчеркнуть), чтобы правильно отображался в NSAttributedString, при использовании нового San Francisco в iOS 9.

Мне действительно нужно получить <b> (полужирным шрифтом) и <i> (курсив) для рендеринга.

Вот что я делаю:

let text = "<i>Any</i> <b>Text</b> <u>that's basic HTML</u>" 
let font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody) 

let modifiedFont = NSString(format:"<span style=\"font-family: '-apple-system','HelveticaNeue'; font-size: %f \">%@</span>", 
font.pointSize, text) as String 

let data = (modifiedFont as NSString).dataUsingEncoding(NSUTF8StringEncoding) 

let attributedString = try? NSAttributedString(data: data!, options: 
      [ NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType, 
       NSCharacterEncodingDocumentAttribute : NSUTF8StringEncoding, 
       NSFontAttributeName : font ], 
      documentAttributes: nil) 

Но, к сожалению, <i> (курсив) и <b> (выделены жирным шрифтом) теги никогда не делают, только <u> (подчеркивание) делает правильно.

Это точно такой же метод, используемый для работы на iOS 8 с Helvetica-Neue шрифтом, но это не работает с новым iOS 9San Francisco шрифта

Помогите мне <b> (выделены жирным шрифтом) и <i> (курсив), чтобы правильно отображался в NSAttributedString!

Обновление: Я использую динамический текст во всем приложении. Это может быть причиной того, почему вещи не работают ...

+0

Заканчивать мой ответ ниже. Он дает хороший совет для работы как с динамическим текстом, так и с NSAttributedString. – Sakiboy

ответ

3

Использование как NSAttributedString, так и DynamicType в приложении - вот что вызвало проблему.

Оказывается вам НЕОБХОДИМОСТЬ для повторного разбора/рендеринга String после получения UIContentSizeCategoryDidChangeNotification. Вы НЕ МОЖЕТЕ сохранить NSAttributedString, а затем использовать его для сброса текста в UILabel. Вы должны повторно разобрать/отобразить NSAttributedString.

Краткий Пример:

public override func viewDidLoad() { 
    super.viewDidLoad() 

    //register be notified when text size changes. 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("didChangePreferredContentSize:"), name: UIContentSizeCategoryDidChangeNotification, object: nil) 
} 

// The action Selector that gets called after the text size has been changed. 
func didChangePreferredContentSize(notification: NSNotification) { 
    self.myLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline) 
    // 
    // DO NOT do this: 
    // self.myLabel.attributedText = self.myAlreadyRenderedText 
    // 
    //Make sure you re-render/parse the text into a new NSAttributedString. 
    //Do THIS instead: 
    self.myLabel.attributedText = self.renderAttributedText(str) 
} 

//Our method to render/parse the HTML tags in our text. Returns an NSAttributedString. 
func renderAttributedText(str: String) -> NSAttributedString? { 
    let text = "<i>Any</i> <b>Text</b> <u>that's basic HTML</u>" 
    let font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody) 

    let modifiedFont = NSString(format:"<span style=\"font-family: '-apple-system','HelveticaNeue'; font-size: %f \">%@</span>",font.pointSize, text) as String 

    let data = (modifiedFont as NSString).dataUsingEncoding(NSUTF8StringEncoding) 

    let attributedString = try? NSAttributedString(data: data!, options: 
     [ NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType, 
      NSCharacterEncodingDocumentAttribute : NSUTF8StringEncoding, 
      NSFontAttributeName : font ], 
     documentAttributes: nil) 

    return attributedString 
} 

deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 
Смежные вопросы