Отображение html-текста в uitextview
Как я могу отобразить текст HTML в textview?
например,
string <h1>Krupal testing <span style="font-weight:
bold;">Customer WYWO</span></h1>
предположим, что текст выделен жирным шрифтом, поэтому он отображается в textview как полужирная строка
но я хочу отобразить обычный текст. Возможно ли это в iPhone SDK?
11 ответов:
используйте UIWebView на iOS 5-.
на iOS 6+ Вы можете использовать
UITextView.attributedString, см. https://stackoverflow.com/a/20996085 Для как.
есть еще и недокументированные
-[UITextView setContentToHTMLString:]метод. Не используйте это, если вы хотите отправить в AppStore.
используйте следующий блок кода для 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;
на Swift 4 и Swift 4.2:
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></head></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на 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></head></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
БХУПИ
ответ правильный , но если вы хотите объединить свой пользовательский шрифт из UILabel или UITextView с HTML-контентом, вам нужно немного исправить 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;
вы можете посмотреть классы OHAttributedLabel, я использовал их, чтобы преодолеть такую проблему с моим текстовым полем. В этом они переопределили метод drawRect для получения требуемого стиля.
мой первый ответ был сделан до того, как iOS 7 представила явную поддержку отображения атрибутивных строк в общих элементах управления. Теперь вы можете установить
attributedTextofUITextViewдоNSAttributedStringсоздано из HTML контента с помощью:-(id)initWithData:(NSData *)data options:(NSDictionary *)options documentAttributes:(NSDictionary **)dict error:(NSError **)error- initWithData: options:documentAttributes: error: (Apple Doc)
оригинальный ответ, сохраненный для истории:
если вы используете
UIWebView, ваше решение будет зависеть непосредственно отCoreText. Как ElanthiraiyanS указывает, что некоторые проекты с открытым исходным кодом появились для упрощения рендеринга форматированного текста. Я бы рекомендовалNSAttributedString-Additions-For-HTML(Edit: проект был вытеснен DTCoreText), который имеет классы для создания и отображения атрибутивных строк из HTML.
ответ мне подошел, что из БХУПИ.
передача кода в swift, как показано ниже:
обратите внимание "allowLossyConversion: false"
Если вы установите значение true, он будет показывать чистый текст.
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
Для 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
для некоторых случаев UIWebView является хорошим решением. Потому что:
- он отображает таблицы, изображения, другие файлы
- это быстро (по сравнению с NSAttributedString: NSHTMLTextDocumentType)
- это из коробки
использование NSAttributedString может привести к сбоям, если html является сложным или содержит таблицы (вот пример)
для загрузки текста в веб-просмотра вы можете использовать следующий фрагмент кода (просто пример):
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) }
вы также можете использовать еще один способ. Библиотека Three20 предлагает метод, с помощью которого мы можем построить стиль textView. Вы можете получить библиотеку здесь:http://github.com/facebook/three20/
класс TTStyledTextLabel имеет метод под названием textFromXHTML: я думаю, это будет служить цели. Но это было бы возможно только в режиме чтения. Я не думаю, что это позволит писать или редактировать HTML-контент.
есть также вопрос, который может помочь вам о это: содержимое строки HTML для UILabel и TextView
Я надеюсь, что это полезно.
NSDoc сохраните текстовый файл в строке в html-файл, а затем одновременно загрузите его в webview, который находится в том же месте, что и ваш UITextView..

Comments