nshtmltextdocumenttype ios

nshtmltextdocumenttype - ¿Cómo mostrar una cadena HTML en un UILabel en iOS?



html in label swift (7)

Extensión para Swift 3

extension UILabel { func from(html: String) { if let htmlData = html.data(using: String.Encoding.unicode) { do { self.attributedText = try NSAttributedString(data: htmlData, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) } catch let e as NSError { print("Couldn''t parse /(html): /(e.localizedDescription)") } } } }

Estoy obteniendo un título en formato HTML como

<p> <span style = "color: # 000000;"> <strong> Ejemplo </ strong> </ span> </ p>

Necesito mostrar esta cadena HTML en un UILabel. El código de color y el tamaño de la fuente deben ser los mismos que vienen en HTML. Cuando estoy convirtiendo la cadena HTML en un NSString, solo viene el texto "Ejemplo", y no el color.

¿Hay alguna solución?

Thnx de antemano

Hasta ahora estoy tratando de usar un NSAttributedString de la siguiente manera, pero de esta manera todo el HTML está imprimiendo:

UIFont *font = [UIFont systemFontOfSize:14.0]; UIFont *secondFont = [UIFont systemFontOfSize:10.0]; NSMutableDictionary *firstAttributes; NSMutableDictionary *secondAttributes; NSDictionary *firstAttributeFont = @{NSFontAttributeName:font}; NSDictionary *secondAttributeFont = @{NSFontAttributeName:secondFont}; [firstAttributes addEntriesFromDictionary:firstAttributeFont]; [secondAttributes addEntriesFromDictionary:secondAttributeFont]; [firstAttributes addEntriesFromDictionary:@{NSForegroundColorAttributeName:[UIColor clearColor]}]; [secondAttributes addEntriesFromDictionary:@{NSForegroundColorAttributeName:[UIColor clearColor]}]; NSString* completeString = [NSString stringWithFormat:@"%@",strTitle]; NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:completeString]; [attributedString setAttributes:firstAttributes range:[completeString rangeOfString:strTitle]]; // [attributedString setAttributes:secondAttributes range:[completeString rangeOfString:self.secondAttributeText]]; Cell.lbl_Title.attributedText = attributedString;


Swift 4+

Para Swift 4 y superior uso:

guard let data = "foo".data(using: String.Encoding.unicode) else { return } try? titleLabel.attributedText = NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil)


Hice esto en UITextView de la siguiente manera:

[detailView loadHTMLString:[NSString stringWithFormat:@"<div style=''text-align:justify; font-size:13px;font-family:HelveticaNeue;color:#362932;''>%@",[model.dict valueForKey:@"description"]] baseURL:nil];

O puede usar la biblioteca de RTLabel: https://github.com/honcheng/RTLabel para mostrar el texto html junto con su formato en una etiqueta.


Para iOS7 o más puedes usar esto:

NSString * htmlString = @"<html><body> Some html string </body></html>"; NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil]; UILabel * myLabel = [[UILabel alloc] init]; myLabel.attributedText = attrStr;


Si el texto Html es como

var planeText = "Unseen and not Purchased!" //setting color to the text var htmlText = "<font color=/"#f20707/">" + planeText + "</font>"

Podemos configurar el texto en UILabel como este

if let htmlData = htmlText.data(using: String.Encoding.unicode) { do { let attributedText = try NSAttributedString(data: htmlData, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) //Setting htmltext to uilable uilable.attributedText = attributedText } catch let e as NSError { //setting plane text to uilable cause of err uilable.text = planeText print("Couldn''t translate /(htmlText): /(e.localizedDescription) ") } }


Swift 2

let htmlText = "<p>etc</p>" if let htmlData = htmlText.dataUsingEncoding(NSUnicodeStringEncoding) { do { someLabel.attributedText = try NSAttributedString(data: htmlData, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) } catch let e as NSError { print("Couldn''t translate /(htmlText): /(e.localizedDescription) ") } }

Swift 3

let htmlText = "<p>etc</p>" if let htmlData = htmlText.data(using: String.Encoding.unicode) { do { let attributedText = try NSAttributedString(data: htmlData, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) } catch let e as NSError { print("Couldn''t translate /(htmlText): /(e.localizedDescription) ") } }


-(NSString*)convertHtmlPlainText:(NSString*)HTMLString{ NSData *HTMLData = [HTMLString dataUsingEncoding:NSUTF8StringEncoding]; NSAttributedString *attrString = [[NSAttributedString alloc] initWithData:HTMLData options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType} documentAttributes:NULL error:NULL]; NSString *plainString = attrString.string; return plainString; } UILabel * htmlLabel = [UILabel alloc] init]; htmlLabel.text = [self convertHtmlPlainText:htmlResponse];