Конвертировать HTML в NSAttributedString в iOS - PullRequest
140 голосов
/ 18 ноября 2010

Я использую экземпляр UIWebView для обработки некоторого текста и его правильного цвета, он дает результат в виде HTML, но вместо того, чтобы отображать его в UIWebView Я хочу отобразить его, используя Core Text с NSAttributedString.

Я могу создать и нарисовать NSAttributedString, но я не уверен, как можно преобразовать и отобразить HTML-код в приписанную строку.

Я понимаю, что под Mac OS X NSAttributedStringесть метод initWithHTML:, но это было добавление только для Mac и недоступно для iOS.

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

Ответы [ 14 ]

2 голосов
/ 22 февраля 2017

Использование NSHTMLTextDocumentType является медленным и трудно контролировать стили.Я предлагаю вам попробовать мою библиотеку, которая называется Atributika.У него есть свой очень быстрый HTML-парсер.Также вы можете иметь любые имена тегов и определять для них любой стиль.

Пример:

let str = "<strong>Hello</strong> World!".style(tags:
    Style("strong").font(.boldSystemFont(ofSize: 15))).attributedString

label.attributedText = str

Вы можете найти его здесь https://github.com/psharanda/Atributika

2 голосов
/ 30 декабря 2015

Приведенное выше решение является правильным.

[[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] 
                                 options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                           NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} 
                      documentAttributes:nil error:nil];

Но приложение вылетает, если вы запускаете его на ios 8.1,2 или 3.

Чтобы избежать сбоя, вы можете: запустить его в очереди. Так что это всегда будет в главном потоке.

0 голосов
/ 31 мая 2019

со шрифтом

extension NSAttributedString
{
internal convenience init?(html: String, font: UIFont? = nil) {
    guard let data = html.data(using: String.Encoding.utf16, allowLossyConversion: false) else {
        return nil
    }
    assert(Thread.isMainThread)
    guard let attributedString = try?  NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil) else {
        return nil
    }
    let mutable = NSMutableAttributedString(attributedString: attributedString)
    if let font = font {
        mutable.addAttribute(.font, value: font, range: NSRange(location: 0, length: mutable.length))
    }
    self.init(attributedString: mutable)
}
}

в качестве альтернативы, вы можете использовать версии, из которых это было получено, и установить шрифт в UILabel после установки attribuStString

0 голосов
/ 18 сентября 2016

Полезные расширения

Вдохновленный этим потоком, модулем и примером ObjC Эрики Садун в iOS Gourmet Cookbook стр. 80, я написал расширение для String и NSAttributedString для перехода туда-сюдамежду обычными строками HTML и NSAttributedStrings и наоборот - на GitHub здесь , что я считаю полезным.

подписи (опять же, полный код вГист, ссылка выше):

extension NSAttributedString {
    func encodedString(ext: DocEXT) -> String?
    static func fromEncodedString(_ eString: String, ext: DocEXT) -> NSAttributedString? 
    static func fromHTML(_ html: String) -> NSAttributedString? // same as above, where ext = .html
}

extension String {
    func attributedString(ext: DocEXT) -> NSAttributedString?
}

enum DocEXT: String { case rtfd, rtf, htm, html, txt }
...