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

Как отобразить текст HTML в текстовом виде?

Например,

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

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

Ответ 1

Использовать UIWebView на iOS 5-.

В iOS 6+ вы можете использовать UITextView.attributedString, см. fooobar.com/questions/90956/... для.


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

Ответ 2

Используйте следующий блок кода для 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;

Ответ 3

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

Ответ 4

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

Вы можете увидеть разницу на картинке ниже: enter image description here

Ответ 5

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

https://github.com/AliSoftware/OHAttributedLabel

Ответ 6

Мой первый ответ был сделан до того, как в iOS 7 появилась явная поддержка отображения атрибутных строк в общих элементах управления. Теперь вы можете установить attributedText of UITextView в NSAttributedString, созданный из содержимого HTML, используя:

-(id)initWithData:(NSData *)data options:(NSDictionary *)options documentAttributes:(NSDictionary **)dict error:(NSError **)error 

- initWithData: options: documentAttributes: ошибка: (Apple Doc)

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

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

Ответ 7

Ответ подошел ко мне, что от 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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

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

Я надеюсь, что это будет полезно.

Ответ 11

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