Mostrar texto html en uitextview

¿Cómo puedo visualizar texto HTML en la vista de texto?

Por ejemplo,

string <h1>Krupal testing <span style="font-weight: bold;">Customer WYWO</span></h1> 

Supongamos que el texto está en negrita, por lo que se muestra en texto como una cadena en negrita, pero quiero mostrar el texto normal. ¿Es esto posible en el iPhone SDK?

Use un UIWebView en iOS 5-.

En iOS 6+ puede usar UITextView.attributedString , consulte https://stackoverflow.com/a/20996085 para ver cómo.


También hay un método indocumentado -[UITextView setContentToHTMLString:] . No use esto si desea enviar a AppStore.

Use el siguiente bloque de código para iOS 7+.

 NSString *htmlString = @"

Header

Subheader

Some text

"; NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData: [htmlString dataUsingEncoding:NSUnicodeStringEncoding] options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes: nil error: nil ]; textView.attributedText = attributedString;

Para Swift 4:

 let htmlString = "" + "" + "" + "" + "" + "

A title

" + "

A paragraph

" + "bold text" + "" let htmlData = NSString(string: htmlString).data(using: String.Encoding.unicode.rawValue) let options = [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html] let attributedString = try! NSAttributedString(data: htmlData!, options: options, documentAttributes: nil) textView.attributedText = attributedString

Para Swift 3 :

 let htmlString = "" + "" + "" + "" + "" + "

A title

" + "

A paragraph

" + "bold text" + "" let htmlData = NSString(string: htmlString).data(using: String.Encoding.unicode.rawValue) let attributedString = try! NSAttributedString(data: htmlData!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) textView.attributedText = attributedString

BHUPI

la respuesta es correcta, pero si desea combinar su fuente personalizada de UILabel o UITextView con contenido HTML, debe corregir su html un poco:

 NSString *htmlString = @"Bold
Italic

Deleted

List

  • Coffee
  • Tea

Link "; htmlString = [htmlString stringByAppendingString:@""]; /*Example: htmlString = [htmlString stringByAppendingString:[NSString stringWithFormat:@"",_myLabel.font.fontName,_myLabel.font.pointSize]]; */ NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData: [htmlString dataUsingEncoding:NSUnicodeStringEncoding] options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes: nil error: nil ]; textView.attributedText = attributedString;

U puede ver la diferencia en la imagen a continuación: enter image description here

Puedes echar un vistazo a las clases OHAttributedLabel, las utilicé para superar este tipo de problema con mi textField. En esto, han anulado el método drawRect para obtener el estilo requerido.

https://github.com/AliSoftware/OHAttributedLabel

Mi primera respuesta fue hecha antes de que iOS 7 presentara soporte explícito para mostrar cadenas atribuidas en controles comunes. Ahora puede establecer attributedText de UITextView en un NSAttributedString creado a partir de contenido HTML utilizando:

 -(id)initWithData:(NSData *)data options:(NSDictionary *)options documentAttributes:(NSDictionary **)dict error:(NSError **)error 

– initWithData: options: documentAttributes: error: (Apple Doc)

Respuesta original, preservada para la historia:

A menos que use UIWebView , su solución dependerá directamente de CoreText . Como señala ElanthiraiyanS, han surgido algunos proyectos de código abierto para simplificar el procesamiento de texto enriquecido. Recomendaría NSAttributedString-Additions-For-HTML ( Edit: el proyecto ha sido reemplazado por DTCoreText ), que presenta clases para generar y mostrar cadenas atribuidas desde HTML.

La respuesta me ha quedado de BHUPI.

La transferencia de código a swift como a continuación:

Preste atención “allowLossyConversion: false”

si establece el valor en verdadero, mostrará texto puro.

 let theString = "

H1 title

Logo
~end~" let theAttributedString = try! NSAttributedString(data: theString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) UITextView_Message.attributedText = theAttributedString

Para Swift3

  let theString = "

H1 title

Logo
~end~" let theAttributedString = try! NSAttributedString(data: theString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) UITextView_Message.attributedText = theAttributedString

En algunos casos, UIWebView es una buena solución. Porque:

  • muestra tablas, imágenes, otros archivos
  • es rápido (en comparación con NSAttributedString: NSHTMLTextDocumentType)
  • está fuera de la caja

El uso de NSAttributedString puede provocar lockings, si html es complejo o contiene tablas ( por ejemplo, )

Para cargar texto en la vista web, puede usar el siguiente fragmento (solo ejemplo):

 func loadHTMLText(_ text: String?, font: UIFont) { let fontSize = font.pointSize * UIScreen.screens[0].scale let html = """ \(text ?? "") """ self.loadHTMLString(html, basehttps://stackoverflow.com/questions/2454067/display-html-text-in-uitextview/URL: nil) } 

También puedes usar una forma más. La biblioteca Three20 ofrece un método mediante el cual podemos construir un estilo textView. Puede obtener la biblioteca aquí: http://github.com/facebook/three20/

La clase TTStyledTextLabel tiene un método llamado textFromXHTML: supongo que esto serviría para el propósito. Pero sería posible en modo solo lectura. No creo que permita escribir o editar contenido HTML.

También hay una pregunta que puede ayudarlo con respecto a esto: Contenido de la secuencia HTML para UILabel y TextView

Espero que sea útil.

NSDoc guarda el archivo de texto en una cadena en un archivo html y luego lo carga en una vista web que está en el mismo lugar que su UITextView.