Estoy usando una instancia de UIWebView
para procesar algo de texto y colorearlo correctamente, da el resultado como HTML, pero en lugar de mostrarlo en el UIWebView
quiero mostrarlo usando Core Text
a NSAttributedString
.
Puedo crear y dibujar el, NSAttributedString
pero no estoy seguro de cómo puedo convertir y asignar el HTML a la cadena atribuida.
Entiendo que bajo Mac OS X NSAttributedString
tiene un initWithHTML:
método, pero esta fue una adición de Mac y no está disponible para iOS.
También sé que hay una pregunta similar a esto, pero no tenía respuestas, pensé que volvería a intentarlo y vería si alguien ha creado una forma de hacerlo y, de ser así, si podrían compartirlo.
Respuestas:
En iOS 7, UIKit agregó un
initWithData:options:documentAttributes:error:
método que puede inicializarNSAttributedString
usando HTML, por ejemplo:En Swift:
fuente
Hay una adición de código abierto de trabajo en progreso a NSAttributedString por Oliver Drobnik en Github. Utiliza NSScanner para el análisis HTML.
fuente
¡La creación de una NSAttributedString desde HTML debe hacerse en el hilo principal!
Actualización: Resulta que la representación NSAttributedString HTML depende de WebKit bajo el capó, y debe ejecutarse en el hilo principal o ocasionalmente bloqueará la aplicación con un SIGTRAP .
Nuevo registro de bloqueo de reliquias:
A continuación se muestra una extensión de cadena Swift 2 segura para subprocesos actualizada :
Uso:
Salida:
fuente
Extensión de inicializador Swift en NSAttributedString
Mi inclinación era agregar esto como una extensión en
NSAttributedString
lugar deString
. Lo probé como una extensión estática y un inicializador. Prefiero el inicializador que es lo que he incluido a continuación.Swift 4
Swift 3
Ejemplo
fuente
guard ... NSMutableAttributedString(data:...
portry self.init(data:...
(y agréguelothrows
al init)Esta es una
String
extensión escrita en Swift para devolver una cadena HTML comoNSAttributedString
.Usar,
En lo anterior, he agregado a propósito unicode \ u2022 para mostrar que procesa unicode correctamente.
Un trivial: la codificación predeterminada que
NSAttributedString
usa esNSUTF16StringEncoding
(¡no UTF8!).fuente
Realizó algunas modificaciones en la solución de Andrew y actualizó el código a Swift 3:
Este código ahora usa UITextView como
self
y puede heredar su fuente original, tamaño de fuente y color de textoNota:
toHexString()
es la extensión desde aquíEjemplo de uso:
fuente
Versión Swift 3.0 Xcode 8
fuente
Swift 4
Uso
fuente
La única solución que tiene en este momento es analizar el HTML, construir algunos nodos con atributos de punto / fuente / etc., y luego combinarlos en una NSAttributedString. Es mucho trabajo, pero si se hace correctamente, puede ser reutilizable en el futuro.
fuente
La solución anterior es correcta.
Pero la aplicación se bloqueará si la está ejecutando en iOS 8.1,2 o 3.
Para evitar el bloqueo, lo que puede hacer es: ejecutar esto en una cola. Para que siempre esté en el hilo principal.
fuente
El uso de NSHTMLTextDocumentType es lento y es difícil controlar los estilos. Te sugiero que pruebes mi biblioteca que se llama Atributika. Tiene su propio analizador de HTML muy rápido. También puede tener cualquier nombre de etiqueta y definir cualquier estilo para ellos.
Ejemplo:
Lo puedes encontrar aquí https://github.com/psharanda/Atributika
fuente
Swift 3 :
prueba esto :
Y para usar:
fuente
Extensiones Útiles
Inspirado por este hilo, un pod y el ejemplo ObjC de Erica Sadun en iOS Gourmet Cookbook p.80, escribí una extensión una
String
y otra vezNSAttributedString
para ir y venir entre cadenas simples HTML y NSAttributedStrings y viceversa, aquí en GitHub , que He encontrado útilLas firmas son (nuevamente, código completo en un Gist, enlace de arriba):
fuente
con fuente
alternativamente, puede usar las versiones de las que se deriva y establecer la fuente en UILabel después de configurartribuString
fuente
La conversión integrada siempre establece el color del texto en UIColor.black, incluso si pasa un diccionario de atributos con .forgroundColor establecido en otra cosa. Para admitir el modo OSCURO en iOS 13, pruebe esta versión de la extensión en NSAttributedString.
fuente