Comment puis-je afficher du texte HTML dans textview?
Par exemple,
string <h1>Krupal testing <span style="font-weight:
bold;">Customer WYWO</span></h1>
Supposons que le texte soit en gras, de sorte qu'il s'affiche dans textview sous forme de chaîne en gras mais que je souhaite afficher du texte normal. Est-ce possible dans le SDK de l'iPhone?
Utilisez un UIWebView sur iOS 5-.
Sur iOS 6+, vous pouvez utiliser UITextView.attributedString
, voir https://stackoverflow.com/a/20996085 pour savoir comment.
Il y a aussi un non documenté -[UITextView setContentToHTMLString:]
méthode. Ne l'utilisez pas si vous souhaitez soumettre à AppStore.
Utilisez le bloc de code suivant pour ios 7+.
NSString *htmlString = @"<h1>Header</h1><h2>Subheader</h2><p>Some <em>text</em></p><img src='http://blogs.babble.com/famecrawler/files/2010/11/mickey_mouse-1097.jpg' width=70 height=100 />";
NSAttributedString *attributedString = [[NSAttributedString alloc]
initWithData: [htmlString dataUsingEncoding:NSUnicodeStringEncoding]
options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType }
documentAttributes: nil
error: nil
];
textView.attributedText = attributedString;
Pour Swift 4 et Swift 4.2:
let htmlString = "<html>" +
"<head>" +
"<style>" +
"body {" +
"background-color: rgb(230, 230, 230);" +
"font-family: 'Arial';" +
"text-decoration:none;" +
"}" +
"</style>" +
"</head>" +
"<body>" +
"<h1>A title</h1>" +
"<p>A paragraph</p>" +
"<b>bold text</b>" +
"</body></html>"
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
Pour Swift:
let htmlString = "<html>" +
"<head>" +
"<style>" +
"body {" +
"background-color: rgb(230, 230, 230);" +
"font-family: 'Arial';" +
"text-decoration:none;" +
"}" +
"</style>" +
"</head>" +
"<body>" +
"<h1>A title</h1>" +
"<p>A paragraph</p>" +
"<b>bold text</b>" +
"</body></html>"
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 réponse est correcte, mais si vous souhaitez combiner votre police personnalisée à partir de UILabel ou UITextView avec du contenu HTML, vous devez corriger un peu votre code HTML:
NSString *htmlString = @"<b>Bold</b><br><i>Italic</i><p> <del>Deleted</del><p>List<ul><li>Coffee</li><li type='square'>Tea</li></ul><br><a href='URL'>Link </a>";
htmlString = [htmlString stringByAppendingString:@"<style>body{font-family:'YOUR_FONT_HERE'; font-size:'SIZE';}</style>"];
/*Example:
htmlString = [htmlString stringByAppendingString:[NSString stringWithFormat:@"<style>body{font-family: '%@'; font-size:%fpx;}</style>",_myLabel.font.fontName,_myLabel.font.pointSize]];
*/
NSAttributedString *attributedString = [[NSAttributedString alloc]
initWithData: [htmlString dataUsingEncoding:NSUnicodeStringEncoding]
options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType }
documentAttributes: nil
error: nil
];
textView.attributedText = attributedString;
Vous pouvez consulter les classes OHAttributedLabel. Je les ai utilisées pour résoudre ce type de problème avec textField. En cela, ils ont remplacé la méthode drawRect pour obtenir le style requis.
Ma première réponse a été faite avant qu'iOS 7 n'introduise un support explicite pour l'affichage de chaînes attribuées dans des contrôles communs. Vous pouvez maintenant définir attributedText
sur UITextView
sur un NSAttributedString
créé à partir de contenu HTML à l'aide de:
-(id)initWithData:(NSData *)data options:(NSDictionary *)options documentAttributes:(NSDictionary **)dict error:(NSError **)error
- initWithData: options: documentAttributes: erreur: (Apple Doc)
Réponse originale, préservée pour l'histoire:
Sauf si vous utilisez UIWebView
, votre solution s'appuiera directement sur CoreText
. Comme le souligne ElanthiraiyanS, certains projets open source ont vu le jour pour simplifier le rendu de texte enrichi. je recommanderais NSAttributedString-Additions-For-HTML ( Edit: le projet a été supplanté DTCoreText ), qui comporte des classes pour générer et afficher des chaînes attribuées à partir de HTML.
La réponse m'a semblé bien celle de BHUPI.
Le code est transféré vers Swift comme ci-dessous:
Faites attention "allowLossyConversion: false"
si vous définissez la valeur sur true, le texte pur sera affiché.
let theString = "<h1>H1 title</h1><b>Logo</b><img src='http://www.aver.com/Images/Shared/logo-color.png'><br>~end~"
let theAttributedString = try! NSAttributedString(data: theString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!,
options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil)
UITextView_Message.attributedText = theAttributedString
Pour Swift3
let theString = "<h1>H1 title</h1><b>Logo</b><img src='http://www.aver.com/Images/Shared/logo-color.png'><br>~end~"
let theAttributedString = try! NSAttributedString(data: theString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!,
options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil)
UITextView_Message.attributedText = theAttributedString
Dans certains cas, UIWebView est une bonne solution. Car:
L'utilisation de NSAttributedString peut provoquer des plantages si le code HTML est complexe ou contient des tableaux ( exemple, par exemple )
Pour charger du texte dans l'affichage Web, vous pouvez utiliser l'extrait suivant (exemple):
func loadHTMLText(_ text: String?, font: UIFont) {
let fontSize = font.pointSize * UIScreen.screens[0].scale
let html = """
<html><body><span style=\"font-family: \(font.fontName); font-size: \(fontSize)\; color: #112233">\(text ?? "")</span></body></html>
"""
self.loadHTMLString(html, baseURL: nil)
}