uitextviewでhtmlテキストを表示する


83

HTMLテキストをtextviewで表示するにはどうすればよいですか?

例えば、

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

テキストが太字であるため、textviewに太字の文字列として表示されますが、通常のテキストを表示したいとします。これはiPhoneSDKで可能ですか?

回答:


53

iOS5でUIWebViewを使用します。

iOS 6以降ではUITextView.attributedString、使用できます。方法については、https: //stackoverflow.com/a/20996085を参照してください


文書化されていない -[UITextView setContentToHTMLString:]方法もあります。AppStoreに送信する場合は、これを使用しないでください。


48
文書化されていない方法を使用したため、アプリは拒否されます.........私はすでにそれを経験しています。
Satyam 2010年

この方法はまだiOS7で文書化されていませんか?
Ajeet 2013年

1
あなたがそれを見つけることができない場合@Ajeet developer.apple.comそれが文書化されていないの当時。
kennytm 2013年

1
こんにちは、テキストビューの高さを計算する方法は?テキストビューをスクロールさせたくありません。textView.contensizeを使用しました。動作しませんでした。
durgaprasad 2014年

1
できます。ただし、HTMLテーブルのコンテンツも表示する必要があります。試してみると、<th>タグの内容しか表示されません。HTMLテーブルのコンテンツを表示する方法は?
タマライT19年

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];
Gaston Morixe 2015

1
@Durgaprasadを使用して文字列のスタイルを変更するには、可変コピーを作成して属性を設定できます。– NSMutableAttributedString *mString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedString]; [mString addAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} range:NSMakeRange(0, mString.length)];
Sound Blaster

48

スイフト4スイフト4.2:スウィフト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

スウィフト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 2017

ありがとう@pableirosそれはうまくいきましたが、私が望む方法ではありませんでした。私の外部CSSはbootstrap.min.cssをインポートします。コンテンツを取得してCSSをUItextViewに適用すると機能しません。
mansuu .... 2017

どうもありがとうございました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 2017

外部CSSを追加したいのですが、どうすればよいですか?@David
Mansuu ....


9

私の最初の応答は、iOS7が共通のコントロールに属性付き文字列を表示するための明示的なサポートを導入する前に行われました。これでattributedText、以下UITextViewNSAttributedString使用して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から属性付き文字列を生成および表示するクラスを備えています。


4

答えは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

2
NSUnicodeStringEncodingNSStringはUTF8ではなくUnicodeでエンコードされているため、正しいです。CJKキャラクターの場合、正解は得られません。
DawnSong 2016

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

もう1つの方法を使用することもできます。Three20ライブラリは、スタイル付きのtextViewを作成するためのメソッドを提供します。ここでライブラリを入手できます:http//github.com/facebook/three20/

クラスTTStyledTextLabelにはtextFromXHTMLというメソッドがあります。これが目的に役立つと思います。ただし、読み取り専用モードでは可能です。HTMLコンテンツを書いたり編集したりすることはできないと思います。

これに関してあなたを助けることができる質問もあります:UILabelとTextViewのHTML文字列コンテンツ

お役に立てば幸いです。


-3

NSDocは、テキストファイルを文字列でhtmlファイルに保存し、同時にUITextViewと同じ場所にあるWebビューにロードします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.