web-dev-qa-db-fra.com

Afficher le texte HTML dans uitextview

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?

76
milanjansari

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.

52
kennytm

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;
228
Bhoopi

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
37
pableiros

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 voir la différence sur la photo ci-dessous: enter image description here

16
David

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.

https://github.com/AliSoftware/OHAttributedLabel

12
sElanthiraiyan

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.

9
Justin

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
4
米米米

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
3
Ajay Iyer

Dans certains cas, UIWebView est une bonne solution. Car:

  • il affiche des tableaux, des images, d'autres fichiers
  • c'est rapide (comparaison avec NSAttributedString: NSHTMLTextDocumentType)
  • c'est hors de la boîte

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)
    }
0
HotJard