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?
ios
iphone
uitextview
milanjansari
źródło
źródło
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;
źródło
NSAttributedString
doNSMutableAttributedString
i dodać[attributedString addAttributes:@{NSFontAttributeName: font} range:NSMakeRange(0, attributedString.length)];
tv.frame = CGRectMake(0, 0, HUGE, 1); [tv sizeToFit];
NSMutableAttributedString *mString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedString]; [mString addAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} range:NSMakeRange(0, mString.length)];
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
źródło
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 StringOdpowiedź 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:
źródło
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
źródło
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ć
attributedText
odUITextView
doNSAttributedString
stworzony 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 naCoreText
. Jak wskazuje ElanthiraiyanS, pojawiły się pewne projekty open source, które upraszczają renderowanie tekstu sformatowanego. PolecamNSAttributedString-Dodatki-for-HTML( Edycja: projekt został wyparty DTCoreText ), która oferuje zajęcia do generowania i wyświetlania nadana sznurki z HTML.źródło
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
NSUnicodeStringEncoding
jest poprawne, ponieważ NSString jest zakodowany w Unicode, a nie w UTF8. W przypadku postaci CJK nie uzyskasz właściwej odpowiedzi.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
źródło
W niektórych przypadkach dobrym rozwiązaniem jest UIWebView. Dlatego:
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) }
źródło
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.
źródło
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.
źródło