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?

milanjansari
źródło

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.

kennytm
źródło
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;
Bhoopi
źródło
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
pableiros
źródło
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

David
źródło
1
Czy możesz umieścić tutaj czcionkę systemową Apple?
coolcool1994
Chcę dodać zewnętrzny CSS, jak mogę to zrobić? @David
Mansuu ....
12

Możesz rzucić okiem na klasy OHAttributedLabel, użyłem ich do rozwiązania tego rodzaju problemu z moim textField. W tym celu nadpisali metodę drawRect, aby uzyskać wymagany styl.

https://github.com/AliSoftware/OHAttributedLabel

sElanthiraiyan
źródło
W jaki sposób OHAttributedLabel może wyświetlać tagi ul li?
user2955351
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.

Justin
źródło
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
米米米
źródło
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
Ajay Iyer
źródło
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)
    }
HotJard
źródło
-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.

Dip Dhingani
źródło
-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.

Albert Renshaw
źródło