Відображення HTML-тексту у форматі uitextview


83

Як можна відобразити текст 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)];
Ajumal

1
Для автоматичного розміру tv.frame = CGRectMake(0, 0, HUGE, 1); [tv sizeToFit];
Gaston Morixe

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

48

Для 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, отримуючи його вміст.
Мансуу ....

велике спасибі, це працює для мене на швидкі 3 :) так тримати
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

Я хочу додати зовнішній css, як я можу це зробити? @David
Mansuu ....

12

Ви можете переглянути класи OHAttributedLabel, я використовував їх, щоб подолати подібну проблему зі своїм textField. У цьому вони замінили метод drawRect, щоб отримати необхідний стиль.

https://github.com/AliSoftware/OHAttributedLabel


Як OHAttributedLabel може відображати теги li 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 ( Редагувати: проект замінено 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.