Отображение html-текста в uitextview

Как я могу отображать HTML-текст в текстовом режиме?

Например,

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

Предположим, что текст выделен полужирным шрифтом, поэтому он отображается в текстовом виде как полужирная строка, но я хочу отображать обычный текст. Возможно ли это в iPhone SDK?


person milanjansari    schedule 16.03.2010    source источник


Ответы (11)


Используйте UIWebView на iOS 5-.

В iOS 6+ вы можете использовать UITextView.attributedString, см. https://stackoverflow.com/a/20996085, чтобы узнать, как это сделать.


Также существует недокументированный -[UITextView setContentToHTMLString:] метод. Не используйте это, если хотите отправить в AppStore.

person kennytm    schedule 16.03.2010
comment
Приложение будет отклонено за использование недокументированных методов ......... Я уже испытал это. - person Satyam; 01.06.2010
comment
этот метод все еще недокументирован в ios 7? - person Ajeet; 15.10.2013
comment
@Ajeet Если вы не можете найти его на developer.apple.com, значит, он недокументирован. - person kennytm; 15.10.2013
comment
Не удалось найти в справочниках классов. Итак, я думаю, это все еще недокументировано. :( - person Ajeet; 15.10.2013
comment
Если это строка HTML, используйте: [(webView) loadHTMLString: (HTMLString) baseURL: nil]; - person rharvey; 08.11.2013
comment
Привет, как рассчитать высоту просмотра текста? Я не хочу, чтобы текст при просмотре прокручивался. Я использовал textView.contensize. Не получилось. - person Durgaprasad; 20.01.2014
comment
Оно работает. Но мне также нужно показать содержимое таблицы HTML. Когда я попробовал, он показывает только содержимое тега ‹th›. Как показать содержимое HTML-таблицы? - person Thamarai T; 01.08.2019

Используйте следующий блок кода для 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;
person Bhoopi    schedule 08.01.2014
comment
Привет, как рассчитать высоту просмотра текста? Я не хочу, чтобы текст при просмотре прокручивался. Я использовал textView.contensize. Не получилось. - person Durgaprasad; 20.01.2014
comment
Как я мог изменить шрифт строки? Использование addAttribute: NSFontAttributeName кажется, сбрасывает весь шрифт (полужирный). - person jeswang; 09.08.2014
comment
если я хочу установить img src из пакета, как мы можем это назвать? я пробовал вот так, но это не работает @ ‹div style = 'font-size: 14px; font-family: Arial, sans-serif;'› Начало работы с приложением ‹p› ‹strong› Домашняя страница ‹/strong› ‹Br› При открытии приложения вы попадете на главную страницу, откуда сможете переходить к различным разделам приложения, нажимая кнопки навигации. ‹/P› ‹img src = 'images / sample.jpg' style = 'float: right; маржа: 10 пикселей; максимальная ширина: 170 пикселей; ' / ›‹/Div› - person kalyani puvvada; 17.10.2014
comment
Это отличный ответ. Я хочу добавить, что меня запутало то, что я пытался поместить строковые литералы внутри html вместо того, что показано выше. Неправильно (что я делал): html = @ ‹a href=@\www.espn.com\› ESPN ‹/a›; Справа: html = @ ‹a href='www.espn.com'› ESPN ‹/a›; - person Brian Sachetta; 14.01.2015
comment
это работает как угодно, но если я помещу этот фрагмент кода в представление метода viewdidload, загрузка будет очень медленной. любая помощь? - person naresh; 04.05.2015
comment
Чтобы изменить шрифт, измените NSAttributedString на NSMutableAttributedString и добавьте [attributedString addAttributes:@{NSFontAttributeName: font} range:NSMakeRange(0, attributedString.length)]; - person Ajumal; 25.05.2015
comment
Чтобы автоматически изменить размер tv.frame = CGRectMake(0, 0, HUGE, 1); [tv sizeToFit]; - person Gaston Morixe; 31.07.2015
comment
@Durgaprasad, чтобы изменить стиль строки, вы можете создать изменяемую копию и установить для нее свои атрибуты: NSMutableAttributedString *mString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedString]; [mString addAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} range:NSMakeRange(0, mString.length)]; - person Sound Blaster; 23.10.2015
comment
Привет, кто-нибудь использовал этот метод в приложении и получил одобрение в магазине приложений? Когда я использую это преобразование, я получаю отладочное сообщение с жалобой на dlopen (/System/Library/PrivateFrameworks/DataDetectorsUI.framework/DataDetectorsUI, задействована ли частная структура? - person Will; 28.11.2015
comment
@GastonM Большое спасибо .. он отлично решил проблему - person Saurabh Gulia; 31.12.2015
comment
в него не загружаются изображения с url. это ограничение или какие-либо изменения, необходимые для этого - person iPhone 7; 31.03.2016
comment
если мы воспользуемся этим методом, возникнут проблемы при загрузке в магазин приложений? - person Mahesh Cheliya; 23.04.2016
comment
@MaheshCheliya У меня не возникло никаких проблем при загрузке приложения в магазин приложений. Никаких проблем быть не должно. Удачи тебе. - person Bhoopi; 26.04.2016
comment
@jeswang У меня такая же проблема. Вы нашли решение? - person Vinayak Parmar; 05.08.2017
comment
@BHUPI Добавление атрибута через addAttribute сбрасывает шрифт всего текста. Он не уважает полужирный тег и весь HTML. Как это исправить. Любая идея? - person Vinayak Parmar; 05.08.2017
comment
@Durgaprasad Думаю, вы нашли ответ через 4 года, но если вы этого не сделали. let height = label.systemLayoutSizeFitting (UILayoutFittingCompressedSize) .height - person Ke MA; 06.02.2018

Для Swift 4, Swift 4.2: и 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

Для 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
person pableiros    schedule 29.11.2016
comment
Есть ли способ добавить внешний css в строку с атрибуцией html @pableiros - person Mansuu....; 29.08.2017
comment
@Mansuu .... Вы должны прочитать файл css из своего пакета: let path = Bundle.main.path(forResource: "styles", ofType: "css"), получить содержимое let content = try! String(contentsOfFile: path!, encoding: String.Encoding.utf8) и добавить его в строку html - person pableiros; 29.08.2017
comment
Спасибо @pableiros Это сработало, но не так, как я хочу. Мой внешний css импортирует bootstrap.min.css. Это не работает, когда я применяю css к UItextView, получая его содержимое. - person Mansuu....; 12.10.2017
comment
спасибо большое, у меня работает Swift 3 :) так держать - person Amr Angry; 23.10.2017

Ответ BHUPI правильный, но если вы хотите объединить свой собственный шрифт из 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;

Вы можете увидеть разницу на картинке ниже:  введите описание изображения здесь

person David    schedule 23.05.2016
comment
Можно сюда поставить системный шрифт Apple? - person coolcool1994; 06.02.2017
comment
Я хочу добавить внешний CSS, как я могу это сделать? @Дэйвид - person Mansuu....; 29.08.2017

Вы можете взглянуть на классы OHAttributedLabel, я использовал их, чтобы решить эту проблему с моим textField. В этом они переопределили метод drawRect, чтобы получить требуемый стиль.

https://github.com/AliSoftware/OHAttributedLabel

person sElanthiraiyan    schedule 16.09.2011
comment
Как OHAttributedLabel может отображать теги ul li? - person user2955351; 31.03.2015

Мой первый ответ был сделан до того, как iOS 7 представила явную поддержку отображения строк с атрибутами в общих элементах управления. Теперь вы можете установить attributedText из UITextView в 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 (Изменить: проект был вытеснен DTCoreText), в котором представлены классы для генерации и отображения строк с атрибутами из HTML.

person Justin    schedule 20.09.2011

Мне подошел ответ от BHUPI.

Перенос кода в 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
person 米米米    schedule 07.10.2015
comment
NSUnicodeStringEncoding правильно, потому что NSString закодирован в Юникоде, а не в UTF8. В случае символа CJK вы не получите правильного ответа. - person DawnSong; 06.04.2016

Для 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
person Ajay Iyer    schedule 14.06.2017

Для некоторых случаев 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)
    }
person HotJard    schedule 30.03.2018

Вы также можете использовать еще один способ. Библиотека Three20 предлагает метод, с помощью которого мы можем создать стилизованный textView. Вы можете получить библиотеку здесь: http://github.com/facebook/three20/

Класс TTStyledTextLabel имеет метод под названием textFromXHTML: я думаю, это послужит цели. Но это было бы возможно в режиме только для чтения. Я не думаю, что это позволит писать или редактировать HTML-контент.

Также есть вопрос, который может помочь вам в этом: содержимое строки HTML для UILabel и TextView

Надеюсь, это поможет.

person Dip Dhingani    schedule 21.09.2011

NSDoc сохраняет текстовый файл в виде строки в html-файл, а затем одновременно загружает его в веб-просмотр, который находится в том же месте, что и ваш UITextView ..

person Albert Renshaw    schedule 21.09.2011