我从一个 Web 服务中获取到了 HTML 响应。以下是我收到的 HTML 内容。
<p><strong>Topic</strong>Gud mrng.</p>
\n<p><strong>Hello Everybody</strong>: How are you.</p>
\n<p><strong>I am fine</strong>: 1 what about you.</p>
我需要在UILabel中显示文本。
请帮忙。
我从一个 Web 服务中获取到了 HTML 响应。以下是我收到的 HTML 内容。
<p><strong>Topic</strong>Gud mrng.</p>
\n<p><strong>Hello Everybody</strong>: How are you.</p>
\n<p><strong>I am fine</strong>: 1 what about you.</p>
我需要在UILabel中显示文本。
请帮忙。
您可以使用属性文本而无需使用任何第三方库来实现此目的。我相信它接受HTML片段,就像您正在获取的那个一样,但是您可能希望将其包装在完整的HTML文档中,以便您可以指定CSS:
static NSString *html =
@"<html>"
" <head>"
" <style type='text/css'>"
" body { font: 16pt 'Gill Sans'; color: #1a004b; }"
" i { color: #822; }"
" </style>"
" </head>"
" <body>Here is some <i>formatting!</i></body>"
"</html>";
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 200)];
NSError *err = nil;
label.attributedText =
[[NSAttributedString alloc]
initWithData: [html dataUsingEncoding:NSUTF8StringEncoding]
options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType }
documentAttributes: nil
error: &err];
if(err)
NSLog(@"Unable to parse label text: %@", err);
虽然不够简洁,但你可以通过为UILabel添加一个类别来整理代码:
@implementation UILabel (Html)
- (void) setHtml: (NSString*) html
{
NSError *err = nil;
self.attributedText =
[[NSAttributedString alloc]
initWithData: [html dataUsingEncoding:NSUTF8StringEncoding]
options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType }
documentAttributes: nil
error: &err];
if(err)
NSLog(@"Unable to parse label text: %@", err);
}
@end
…
[someLabel setHtml:@"Be <b>bold!</b>"];
self.attributedText = [[NSAttributedString alloc] initWithData: [html dataUsingEncoding:NSUTF8StringEncoding] options: @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSFontAttributeName:[UIFont fontWithName:@"HelveticaNeue" size:12.0], NSForegroundColorAttributeName: [UIColor redColor] } documentAttributes: nil error: &err];
似乎不起作用。 - RyanJohnstonesometText<font color=\"#dc2d4e\">372</font>
似乎无法正常工作。 - Zigii Wong[html dataUsingEncoding: NSUTF16StringEncoding]
,因为NSString
是UTF16编码的,即NSUnicodeStringEncoding
。 - DawnSongSwift 4:版本
extension String {
func htmlAttributedString() -> NSAttributedString? {
guard let data = self.data(using: String.Encoding.utf16, allowLossyConversion: false) else { return nil }
guard let html = try? NSMutableAttributedString(
data: data,
options: [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html],
documentAttributes: nil) else { return nil }
return html
}
}
Swift 3:版本
extension String {
func htmlAttributedString() -> NSAttributedString? {
guard let data = self.data(using: String.Encoding.utf16, allowLossyConversion: false) else { return nil }
guard let html = try? NSMutableAttributedString(
data: data,
options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil) else { return nil }
return html
}
}
Swift 2:版本
extension String {
func htmlAttributedString() -> NSAttributedString? {
guard let data = self.dataUsingEncoding(NSUTF16StringEncoding, allowLossyConversion: false) else { return nil }
guard let html = try? NSMutableAttributedString(
data: data,
options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil) else { return nil }
return html
}
}
用法如下:
label.attributedText = yourStringVar.htmlAttributedString()
UITableViewCell
后,当我旋转设备时,标签文本变得更宽了。在从横向到纵向旋转时也会发生同样的情况,标签文本变窄了。为什么会这样?有什么解决方法吗? - Vaibhav Saran我建议使用可失败的方便初始化来扩展NSAttributedString。 String 的本质并不是创建NSAttributedString。
extension NSAttributedString {
convenience init?(html: String) {
guard let data = html.data(using: String.Encoding.unicode, allowLossyConversion: false) else {
return nil
}
guard let attributedString = try? NSAttributedString(data: data, options: [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil) else {
return nil
}
self.init(attributedString: attributedString)
}
}
label.attributedText = NSAttributedString(html: "<span> Some <b>bold</b> and <a href='#/userProfile/uname'> Hyperlink </a> and so on </span>")
来源: https://dev59.com/dFXTa4cB1Zd3GeqP6vyi#5581178
如需将HTML转换为纯文本,请下载该文件,并在您的NSString
上使用stringByConvertingHTMLToPlainText
函数。
或者,您可以使用DTCoreText(以前称为NSAttributedString Additions for HTML)。
DTCoreText
构建时出现编译时错误。报错信息为 'DTHTMLParser.h' 文件未找到
。有任何想法吗? - Vaibhav SaranDTCoreText
ن»¥ه‰چه¹¶ن¸چوک¯ن¼—و‰€ه‘¨çں¥çڑ„NSAttributedString
م€‚ - William Entriken以下是 Swift 2 版本:
let htmlStringData = NSString(string: "<strong>Your HTML String here</strong>").dataUsingEncoding(NSUTF8StringEncoding)
guard let html = htmlStringData else { return }
do {
let htmlAttrString = try NSAttributedString(data: html, options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
yourLabel.attributedText = htmlAttrString
} catch {
print("An error occured")
}
**// Swift 4 compatible | with setting of colour and font options:**
// add following extension to String:
func htmlAttributed(family: String?, size: CGFloat, color: UIColor) -> NSAttributedString? {
let sizeInPx = (size * 0.75)
do {
let htmlCSSString = "<style>" +
"html *" +
"{" +
"font-size: \(sizeInPx)pt !important;" +
"color: \(color.hexString ?? "#000000") !important;" +
"font-family: \(family ?? "SFUIText-Regular"), SFUIText !important;" +
"}</style> \(self)"
guard let data = htmlCSSString.data(using: String.Encoding.utf8) else {
return nil
}
return try NSAttributedString(data: data,
options: [.documentType: NSAttributedString.DocumentType.html,
.characterEncoding: String.Encoding.utf8.rawValue],
documentAttributes: nil)
} catch {
print("error: ", error)
return nil
}
}
// add following extension to UIColor:
extension UIColor{
var hexString:String? {
if let components = self.cgColor.components {
let r = components[0]
let g = components[1]
let b = components[2]
return String(format: "%02X%02X%02X", (Int)(r * 255), (Int)(g * 255), (Int)(b * 255))
}
return nil
}
}
// Sample Use:
yourLabel.attributedText = locationTitle.htmlAttributed(family: yourLabel.font.fontName,
size: yourLabel.font.pointSize,
color: yourLabel.textColor)
Swift 3中的上述答案:
var str = "<html> ... some html ... </html>"
let htmlStringData = NSString(string: str).data(using: String.Encoding.utf8.rawValue)
let html = htmlStringData
do {
let htmlAttrString = try? NSAttributedString(
data: html!,
options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil
)
agreementText.attributedText = htmlAttrString
} catch {
print("An error occured")
}
Swift 3 中的答案:
func htmlAttributedString() -> NSAttributedString? {
guard let data = self.data(using: String.Encoding.utf16, allowLossyConversion: false) else { return nil }
guard let html = try? NSMutableAttributedString(
data: data,
options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil) else { return nil }
return html
}
最近我一直在处理部分HTML片段,并将它们转换为带有添加属性功能的属性字符串。这是我编写的扩展版本:
import Foundation
import UIKit
extension String {
func htmlAttributedString(attributes: [String : Any]? = .none) -> NSAttributedString? {
guard let data = self.data(using: String.Encoding.utf16, allowLossyConversion: false) else { return .none }
guard let html = try? NSMutableAttributedString(
data: data,
options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: .none) else { return .none }
html.setAttributes(attributes, range: NSRange(0..<html.length))
return html
}
}
我这样称呼它:
let attributes = [
NSForegroundColorAttributeName: UIColor.lightGray,
NSFontAttributeName : UIFont.systemFont(ofSize: 12).traits(traits: .traitItalic)
]
label?.attributedText = partialHTMLString.htmlAttributedString(attributes: attributes)