在uitextview中显示HTML文本


83

如何在textview中显示HTML文本?

例如,

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

假设文本为粗体,所以它在文本视图中显示为粗体字符串,但我想显示普通文本。iPhone SDK中有可能吗?

Answers:


53

在iOS 5上使用UIWebView。

在iOS 6+上,您可以使用UITextView.attributedString,有关方法,请参见https://stackoverflow.com/a/20996085


还有一个未记录的 -[UITextView setContentToHTMLString:]方法。如果要提交到AppStore,请不要使用它。


48
应用程序将因使用未记录的方法而被拒绝.........我已经遇到过。
萨蒂扬2010年

ios 7中仍未记录此方法吗?
Ajeet

1
@Ajeet如果您在developer.apple.com上找不到它,那么该文件没有记录。
kennytm

1
嗨,如何计算文字视图的高度?我不希望文本视图滚动。我使用了textView.contensize。没有工作。
Durgaprasad 2014年

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。没有工作。
Durgaprasad 2014年

6
如何更改字符串的字体?使用addAttribute:NSFontAttributeName似乎重置了所有字体(粗体)。
jeswang 2014年

15
若要更改字体,改变NSAttributedStringNSMutableAttributedString添加[attributedString addAttributes:@{NSFontAttributeName: font} range:NSMakeRange(0, attributedString.length)];
Ajumal

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)];
声霸卡

48

对于Swift 4Swift 4.2Swift 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 17/08/29

谢谢@pableiros它的工作,但不是我想要的方式。我的外部CSS导入bootstrap.min.css。当我通过获取CSS内容将CSS应用于UItextView时,它不起作用。
Mansuu .... 17-10-12

非常感谢它为我的迅速工作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 '02

我想添加外部CSS,该怎么办?@David
Mansuu ....


9

我的第一个回应是在iOS 7引入显式支持以在公共控件中显示属性字符串之前做出的。现在,您可以设置attributedTextUITextView一个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相比)
  • 开箱即用

如果html复杂或包含表,则使用NSAttributedString可能导致崩溃(因此,示例

要将文本加载到Web视图,您可以使用以下代码段(仅作为示例):

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内容。

还有一个可以帮助您解决此问题的问题:UILabel和TextView的HTML字符串内容

希望对您有所帮助。


-3

NSDoc将文本文件以字符串形式保存为html文件,然后同时将其加载到与UITextView相同位置的Web视图中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.