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];