HTML-Text in uitextview anzeigen

82

Wie kann ich HTML-Text in der Textansicht anzeigen?

Beispielsweise,

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

Angenommen, Text ist fett gedruckt, sodass er in der Textansicht als fette Zeichenfolge angezeigt wird, aber ich möchte normalen Text anzeigen. Ist das im iPhone SDK möglich?

milanjansari
quelle

Antworten:

53

Verwenden Sie eine UIWebView unter iOS 5-.

Unter iOS 6+ können Sie UITextView.attributedStringunter https://stackoverflow.com/a/20996085 nachlesen, wie.


Es gibt auch eine undokumentierte -[UITextView setContentToHTMLString:] Methode. Verwenden Sie diese Option nicht, wenn Sie sie an AppStore senden möchten.

kennytm
quelle
48
App wird für die Verwendung von undokumentierten Methoden abgelehnt ......... Ich habe es bereits erlebt.
Satyam
Ist diese Methode in iOS 7 noch nicht dokumentiert?
Ajeet
1
@Ajeet Wenn Sie es nicht in developer.apple.com finden können , ist es nicht dokumentiert.
Kennytm
1
Hallo, wie berechnet man die Höhe der Textansicht? Ich möchte nicht, dass die Textansicht gescrollt wird. Ich habe textView.contensize verwendet. Hat nicht funktioniert.
Durgaprasad
1
Es klappt. Ich muss aber auch HTML-Tabelleninhalte anzeigen. Wenn ich es versucht habe, wird nur der Inhalt des <th> -Tags angezeigt. Wie zeige ich HTML-Tabelleninhalte an?
Thamarai T
233

Verwenden Sie den folgenden Codeblock für 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;
Bhoopi
quelle
7
Hallo, wie berechnet man die Höhe der Textansicht? Ich möchte nicht, dass die Textansicht gescrollt wird. Ich habe textView.contensize verwendet. Hat nicht funktioniert.
Durgaprasad
6
Wie kann ich die Schriftart der Zeichenfolge ändern? Verwenden von addAttribute: NSFontAttributeName scheint die gesamte Schriftart (fett) zurückzusetzen.
Jeswang
15
Um die Schriftart zu ändern, ändern Sie NSAttributedStringzu NSMutableAttributedStringund fügen [attributedString addAttributes:@{NSFontAttributeName: font} range:NSMakeRange(0, attributedString.length)];
Sie
1
Um es automatisch zu dimensionieren tv.frame = CGRectMake(0, 0, HUGE, 1); [tv sizeToFit];
Gaston Morixe
1
@ Durgaprasad Um den Stil der Zeichenfolge zu ändern, können Sie eine veränderbare Kopie erstellen und Ihre Attribute darauf festlegen:NSMutableAttributedString *mString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedString]; [mString addAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} range:NSMakeRange(0, mString.length)];
Sound Blaster
45

Für Swift 4 , Swift 4.2: und Swift 5

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

Für Swift 3 :

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
Pableiros
quelle
Gibt es eine Möglichkeit, externe CSS zu HTML-Attribut String @pableiros
Mansuu hinzuzufügen ....
@ Mansuu .... Sie müssen die CSS-Datei aus Ihrem Bundle lesen : let path = Bundle.main.path(forResource: "styles", ofType: "css"), Holen Sie sich den Inhalt let content = try! String(contentsOfFile: path!, encoding: String.Encoding.utf8)und fügen Sie ihn dem HTML-String
pableiros
Danke @pableiros Es hat funktioniert, aber nicht so, wie ich es will. Mein externes CSS importiert bootstrap.min.css. Es funktioniert nicht, wenn ich CSS auf UItextView anwende, indem ich dessen Inhalt abrufe.
Mansuu ....
Vielen Dank, es funktioniert für meine für die schnelle 3 :) weiter so
Amr Angry
19

Die Antwort von BHUPI ist richtig, aber wenn Sie Ihre benutzerdefinierte Schriftart aus UILabel oder UITextView mit HTML-Inhalten kombinieren möchten, müssen Sie Ihr HTML ein wenig korrigieren:

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;

Sie können den Unterschied auf dem Bild unten sehen: Geben Sie hier die Bildbeschreibung ein

David
quelle
1
Können Sie hier die Systemschriftart von Apple einfügen?
coolcool1994
Ich möchte externes CSS hinzufügen. Wie kann ich das tun? @ David
Mansuu ....
12

Sie können sich die OHAttributedLabel-Klassen ansehen. Ich habe diese verwendet, um diese Art von Problem mit meinem textField zu lösen. Dabei haben sie die drawRect-Methode überschrieben, um den erforderlichen Stil zu erhalten.

https://github.com/AliSoftware/OHAttributedLabel

Elanthiraiyan
quelle
Wie kann OHAttributedLabel ul li-Tags anzeigen?
user2955351
9

Meine erste Antwort erfolgte, bevor iOS 7 die explizite Unterstützung für die Anzeige von zugewiesenen Zeichenfolgen in allgemeinen Steuerelementen einführte. Sie können nun eingestellt attributedTextvon UITextViewauf eine NSAttributedStringVerwendung von HTML - Inhalten erstellt:

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

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

Ursprüngliche Antwort, für die Geschichte erhalten:

Wenn Sie a nicht verwenden UIWebView, wird Ihre Lösung direkt darauf angewiesen sein CoreText. Wie ElanthiraiyanS hervorhebt, sind einige Open-Source-Projekte entstanden, um das Rendern von Rich-Text zu vereinfachen. Ich würde NSAttributedString-Additions-For-HTML ( Bearbeiten: Das Projekt wurde durch DTCoreText ersetzt ) empfehlen , das Klassen zum Generieren und Anzeigen von zugeordneten Zeichenfolgen aus HTML enthält.

Justin
quelle
4

Die Antwort hat mir von BHUPI gepasst.

Die Codeübertragung erfolgt wie folgt schnell:

Achten Sie auf "allowLossyConversion: false"

Wenn Sie den Wert auf true setzen, wird reiner Text angezeigt.

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
米米米
quelle
2
NSUnicodeStringEncodingist korrekt, da NSString Unicode-codiert ist, nicht UTF8. Im Falle eines CJK-Charakters erhalten Sie keine richtige Antwort.
DawnSong
3

Für 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
Ajay Iyer
quelle
0

In einigen Fällen ist UIWebView eine gute Lösung. Weil:

  • Es werden Tabellen, Bilder und andere Dateien angezeigt
  • es ist schnell (im Vergleich zu NSAttributedString: NSHTMLTextDocumentType)
  • es ist out of the box

Die Verwendung von NSAttributedString kann zu Abstürzen führen, wenn HTML komplex ist oder Tabellen enthält (siehe Beispiel ).

Zum Laden von Text in die Webansicht können Sie das folgende Snippet verwenden (nur ein Beispiel):

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)
    }
HotJard
quelle
-2

Sie können auch einen weiteren Weg verwenden. Die Three20-Bibliothek bietet eine Methode, mit der wir eine gestaltete Textansicht erstellen können. Sie können die Bibliothek hier herunterladen : http://github.com/facebook/three20/

Die Klasse TTStyledTextLabel hat eine Methode namens textFromXHTML: Ich denke, dies würde den Zweck erfüllen. Aber es wäre im schreibgeschützten Modus möglich. Ich denke nicht, dass es erlaubt, HTML-Inhalte zu schreiben oder zu bearbeiten.

Es gibt auch eine Frage, die Ihnen dabei helfen kann: HTML-String-Inhalt für UILabel und TextView

Ich hoffe es ist hilfreich.

Tauchen Sie Dhingani ein
quelle
-3

NSDoc speichert die Textdatei in einer Zeichenfolge in einer HTML-Datei und lädt sie gleichzeitig in eine Webansicht, die sich an derselben Stelle befindet wie Ihre UITextView.

Albert Renshaw
quelle