HTMLテキストをtextviewで表示するにはどうすればよいですか?
例えば、
string <h1>Krupal testing <span style="font-weight:
bold;">Customer WYWO</span></h1>
テキストが太字であるため、textviewに太字の文字列として表示されますが、通常のテキストを表示したいとします。これはiPhoneSDKで可能ですか?
HTMLテキストをtextviewで表示するにはどうすればよいですか?
例えば、
string <h1>Krupal testing <span style="font-weight:
bold;">Customer WYWO</span></h1>
テキストが太字であるため、textviewに太字の文字列として表示されますが、通常のテキストを表示したいとします。これはiPhoneSDKで可能ですか?
回答:
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;
NSAttributedString
しNSMutableAttributedString
て追加します[attributedString addAttributes:@{NSFontAttributeName: font} range:NSMakeRange(0, attributedString.length)];
tv.frame = CGRectMake(0, 0, HUGE, 1); [tv sizeToFit];
NSMutableAttributedString *mString = [[NSMutableAttributedString alloc] initWithAttributedString:attributedString]; [mString addAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]} range:NSMakeRange(0, mString.length)];
用スイフト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
let path = Bundle.main.path(forResource: "styles", ofType: "css")
、コンテンツlet content = try! String(contentsOfFile: path!, encoding: String.Encoding.utf8)
を取得してhtml文字列に追加します
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;
OHAttributedLabelクラスを確認できます。これらを使用して、textFieldに関するこの種の問題を克服しました。この場合、必要なスタイルを取得するためにdrawRectメソッドをオーバーライドしました。
私の最初の応答は、iOS7が共通のコントロールに属性付き文字列を表示するための明示的なサポートを導入する前に行われました。これでattributedText
、以下UITextView
をNSAttributedString
使用して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から属性付き文字列を生成および表示するクラスを備えています。
答えは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
NSUnicodeStringEncoding
NSStringはUTF8ではなくUnicodeでエンコードされているため、正しいです。CJKキャラクターの場合、正解は得られません。
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
場合によっては、UIWebViewが優れたソリューションです。理由:
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)
}
もう1つの方法を使用することもできます。Three20ライブラリは、スタイル付きのtextViewを作成するためのメソッドを提供します。ここでライブラリを入手できます:http://github.com/facebook/three20/
クラスTTStyledTextLabelにはtextFromXHTMLというメソッドがあります。これが目的に役立つと思います。ただし、読み取り専用モードでは可能です。HTMLコンテンツを書いたり編集したりすることはできないと思います。
これに関してあなたを助けることができる質問もあります:UILabelとTextViewのHTML文字列コンテンツ
お役に立てば幸いです。
NSDocは、テキストファイルを文字列でhtmlファイルに保存し、同時にUITextViewと同じ場所にあるWebビューにロードします。