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.