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


84

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

Например,

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

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

Ответы:


53

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

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


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


48
Приложение будет отклонено за использование недокументированных методов ......... Я уже испытал это.
Satyam

этот метод все еще недокументирован в ios 7?
Ajeet

1
@Ajeet Если вы не можете найти его на developer.apple.com, значит, он недокументирован.
kennytm

1
Привет, как рассчитать высоту просмотра текста? Я не хочу, чтобы текст в представлении прокручивался. Я использовал textView.contensize. Не получилось.
Дургапрасад

1
Оно работает. Но мне также нужно показать содержимое таблицы HTML. Когда я попробовал, он показывает только содержимое тега <th>. Как показать содержимое HTML-таблицы?
Thamarai T

233

Используйте следующий блок кода для 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
Привет, как рассчитать высоту просмотра текста? Я не хочу, чтобы текст в представлении прокручивался. Я использовал textView.contensize. Не получилось.
Дургапрасад

6
Как я мог изменить шрифт строки? Использование addAttribute: NSFontAttributeName кажется сбрасывает весь шрифт (жирный).
jeswang

15
Чтобы изменить шрифт, поменяйте NSAttributedStringна NSMutableAttributedStringи добавьте[attributedString addAttributes:@{NSFontAttributeName: font} range:NSMakeRange(0, attributedString.length)];
Аджумал

1
Для автоматического определения размера tv.frame = CGRectMake(0, 0, HUGE, 1); [tv sizeToFit];
Гастон Морикс

1
@Durgaprasad, чтобы изменить стиль строки, вы можете создать изменяемую копию и установить для нее свои атрибуты:NSMutableAttributedString *mString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedString]; [mString addAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} range:NSMakeRange(0, mString.length)];
Sound Blaster,

50

Для 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

Есть ли способ добавить внешний css в строку с атрибуцией html @pableiros
Mansuu ....

@Mansuu .... Вы должны прочитать файл css из вашего пакета:, let path = Bundle.main.path(forResource: "styles", ofType: "css")получить содержимое let content = try! String(contentsOfFile: path!, encoding: String.Encoding.utf8)и добавить его в строку html
pableiros

Спасибо @pableiros Это сработало, но не так, как я хочу. Мой внешний css импортирует bootstrap.min.css. Это не работает, когда я применяю css к UItextView, получая его содержимое.
Мансуу ....

Спасибо большое, у меня работает
Amr Angry

19

Ответ 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;

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


1
Можно сюда поставить системный шрифт Apple?
coolcool1994 06

Я хочу добавить внешний CSS, как я могу это сделать? @David
Mansuu ....

12

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

https://github.com/AliSoftware/OHAttributedLabel


Как OHAttributedLabel может отображать теги ul li?
user2955351

9

Мой первый ответ был сделан до того, как 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)

Оригинальный ответ, сохраненный для истории:

Если вы не используете a UIWebView, ваше решение будет напрямую зависеть от CoreText. Как указывает ElanthiraiyanS, для упрощения рендеринга форматированного текста возникли некоторые проекты с открытым исходным кодом. Я бы порекомендовал NSAttributedString-Additions-For-HTML ( Edit: проект был вытеснен DTCoreText ), в котором есть классы для генерации и отображения строк с атрибутами из HTML.


4

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

Перенос кода на быстрый, как показано ниже:

Обратите внимание на "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

2
NSUnicodeStringEncodingправильно, потому что NSString имеет кодировку Unicode, а не UTF8. В случае символа CJK вы не получите правильного ответа.
DawnSong

3

Для 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

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

-2

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

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

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

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


-3

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.