TextviewでHTMLテキストを表示するにはどうすればよいですか?
例えば、
string <h1>Krupal testing <span style="font-weight:
bold;">Customer WYWO</span></h1>
テキストが太字であるため、textviewでは太字の文字列として表示されますが、通常のテキストを表示する必要があります。これはiPhone SDKで可能ですか?
IOS 5でUIWebViewを使用します。
IOS 6以降では、UITextView.attributedString
、詳細は https://stackoverflow.com/a/20996085 をご覧ください。
また、undocumented-[UITextView setContentToHTMLString:]
方法。 AppStoreに送信する場合は、これを使用しないでください。
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;
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の場合:
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
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メソッドをオーバーライドしました。
IOS 7が共通コントロールで属性付き文字列を表示するための明示的なサポートを導入する前に、私の最初の応答が行われました。次を使用して、HTMLコンテンツから作成されたattributedText
にUITextView
のNSAttributedString
を設定できます。
-(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 (Edit:プロジェクトは置き換えられました 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
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を使用するとクラッシュする可能性があります( so example )
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)
}