Wyświetl tekst HTML w uitextview


84

Jak mogę wyświetlić tekst HTML w widoku tekstowym?

Na przykład,

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

Załóżmy, że tekst jest pogrubiony, więc wyświetla się w widoku tekstowym jako pogrubiony ciąg, ale chcę wyświetlać normalny tekst. Czy jest to możliwe w zestawie iPhone SDK?

Odpowiedzi:


53

Użyj UIWebView w iOS 5.

Na iOS 6+ możesz użyć UITextView.attributedString, zobacz https://stackoverflow.com/a/20996085, aby dowiedzieć się, jak to zrobić .


Istnieje również nieudokumentowana -[UITextView setContentToHTMLString:] metoda. Nie używaj tego, jeśli chcesz przesłać do AppStore.


48
Aplikacja zostanie odrzucona z powodu korzystania z nieudokumentowanych metod ......... Już tego doświadczam.
— Satyam

czy ta metoda jest nadal nieudokumentowana w iOS 7?
— Ajeet

1
@Ajeet Jeśli nie możesz go znaleźć w developer.apple.com, oznacza to, że jest nieudokumentowany.
— kennytm

1
Cześć, Jak obliczyć wysokość widoku tekstu? Nie chcę, aby widok tekstu był przewijany. Użyłem textView.contensize. Nie zadziałało.
— Durgaprasad

1
To działa. Ale muszę też pokazać zawartość tabeli HTML. Kiedy próbowałem, pokazuje tylko zawartość tagu <th>. Jak wyświetlić zawartość tabeli HTML?
— Thamarai T

233

Użyj następującego bloku kodu dla 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;

7
Cześć, Jak obliczyć wysokość widoku tekstu? Nie chcę, aby widok tekstu był przewijany. Użyłem textView.contensize. Nie zadziałało.
— Durgaprasad

6
Jak mogę zmienić czcionkę ciągu? Używanie addAttribute: NSFontAttributeName wydaje się resetować całą czcionkę (pogrubienie).
— jeswang

15
Aby zmienić czcionkę, zmiany NSAttributedStringdo NSMutableAttributedStringi dodać[attributedString addAttributes:@{NSFontAttributeName: font} range:NSMakeRange(0, attributedString.length)];
— Ajumal

1
Aby automagicznie to tv.frame = CGRectMake(0, 0, HUGE, 1); [tv sizeToFit];
— zmierzyć

1
@Durgaprasad zmodyfikować styl struny można utworzyć zmienny kopię i ustawić atrybuty do niego:NSMutableAttributedString *mString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedString]; [mString addAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} range:NSMakeRange(0, mString.length)];
— Sound Blaster

50

Dla Swift 4 , Swift 4.2: i 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

Dla 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

Czy istnieje sposób, aby dodać zewnętrzny plik CSS do html przypisanego ciągu znaków @pableiros
— Mansuu….

@Mansuu .... Musisz odczytać plik css z paczki:, let path = Bundle.main.path(forResource: "styles", ofType: "css")pobierz zawartość let content = try! String(contentsOfFile: path!, encoding: String.Encoding.utf8)i dodaj ją do html String
— pableiros

Dzięki @pableiros Udało się, ale nie tak, jak chcę. Mój zewnętrzny plik css importuje plik bootstrap.min.css. Nie działa, gdy stosuję css do UItextView, pobierając jego zawartość.
— Mansuu ...

wielkie dzięki, to działa dla mnie dla szybkiego 3 :) tak trzymaj
— Amr Angry

19

Odpowiedź BHUPI jest poprawna, ale jeśli chcesz połączyć niestandardową czcionkę z UILabel lub UITextView z treścią HTML, musisz trochę poprawić swój 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;

Różnicę widać na poniższym obrazku: wprowadź opis obrazu tutaj


1
Czy możesz umieścić tutaj czcionkę systemową Apple?
— coolcool1994

Chcę dodać zewnętrzny CSS, jak mogę to zrobić? @David
— Mansuu ....


9

Moja pierwsza odpowiedź powstała zanim iOS 7 wprowadził jawną obsługę wyświetlania przypisanych ciągów we wspólnych kontrolkach. Teraz można ustawić attributedTextod UITextViewdo NSAttributedStringstworzony z treści HTML za pomocą:

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

- initWithData: opcje: documentAttributes: błąd: (Apple Doc)

Oryginalna odpowiedź, zachowana do historii:

Jeśli nie użyjesz a UIWebView, Twoje rozwiązanie będzie polegać bezpośrednio na CoreText. Jak wskazuje ElanthiraiyanS, pojawiły się pewne projekty open source, które upraszczają renderowanie tekstu sformatowanego. Polecam NSAttributedString-Dodatki-for-HTML ( Edycja: projekt został wyparty DTCoreText ), która oferuje zajęcia do generowania i wyświetlania nadana sznurki z HTML.


4

Odpowiedź pasuje do mnie, że od BHUPI.

Transfer kodu do swift jak poniżej:

Zwróć uwagę na „allowLossyConversion: false”

jeśli ustawisz wartość na true, wyświetli się czysty tekst.

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

2
NSUnicodeStringEncodingjest poprawne, ponieważ NSString jest zakodowany w Unicode, a nie w UTF8. W przypadku postaci CJK nie uzyskasz właściwej odpowiedzi.
— DawnSong

3

Dla 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

0

W niektórych przypadkach dobrym rozwiązaniem jest UIWebView. Dlatego:

  • wyświetla tabele, obrazy, inne pliki
  • jest szybki (w porównaniu z NSAttributedString: NSHTMLTextDocumentType)
  • jest po wyjęciu z pudełka

Używanie NSAttributedString może prowadzić do awarii, jeśli html jest złożony lub zawiera tabele (na przykład )

Aby załadować tekst do widoku internetowego, możesz użyć następującego fragmentu kodu (tylko przykład):

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

-2

Możesz też skorzystać z jeszcze jednego sposobu. Biblioteka Three20 oferuje metodę, za pomocą której możemy skonstruować stylizowany textView. Możesz pobrać bibliotekę tutaj: http://github.com/facebook/three20/

Klasa TTStyledTextLabel ma metodę o nazwie textFromXHTML: myślę, że to służyłoby temu celowi. Ale byłoby to możliwe w trybie tylko do odczytu. Nie sądzę, że pozwoli to na pisanie lub edycję treści HTML.

Jest też pytanie, które może Ci w tym pomóc: treść ciągu HTML dla UILabel i TextView

Mam nadzieję, że to pomocne.


-3

NSDoc zapisuje plik tekstowy w postaci ciągu do pliku html, a następnie jednocześnie ładuje go do widoku internetowego, który znajduje się w tym samym miejscu co UITextView.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.