Reputation: 1218
I am getting a HTML Response from a webservice Below is the HTML I am getting in response
<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>
I need to display the text in UILabel.
Please help
Upvotes: 45
Views: 72786
Reputation: 13274
Sometimes we need to display HTML content on the screen by using UILabel. How to display the HTML content in UILabel we see that in this article. let’s start and achieve it.
Objective C:
NSString * htmlString = @"<html><body> <b> HTML in UILabel is here…. </b> </body></html>";
NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[htmlString
dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute:
NSHTMLTextDocumentType } documentAttributes:nil error:nil];
UILabel * yourLabel = [[UILabel alloc] init];
yourLabel.attributedText = attrStr;
Swift:
var htmlString = “<html><body> <b> HTML in UILabel is here…. </b> </body></html>”
var attrStr: NSAttributedString? = nil
do {
if let data = htmlString.data(using: .unicode) {
attrStr = try? NSAttributedString(data: data, options: [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil)
}
} catch {
}
var yourLabel = UILabel()
yourLabel.attributedText = attrStr
Ref: https://medium.com/@javedmultani16/html-text-in-uilabel-ios-f1e0760bcac5
Upvotes: 0
Reputation: 49
The above answer in 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")
}
Upvotes: 1
Reputation: 5876
**// 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)
Upvotes: 1
Reputation: 5115
I would rather suggest to extend NSAttributedString with failable convenience init. String is not responsible for making NSAttributedString by it's nature.
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>")
Upvotes: 6
Reputation: 665
Swift 4: version
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: version
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: version
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
}
}
use it as:
label.attributedText = yourStringVar.htmlAttributedString()
Upvotes: 17
Reputation: 12890
Lately I've been dealing with partial HTML snippets and converting them to attributed strings with the ability to add attributes. Here is my version of the extension
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
}
}
I call it thus:
let attributes = [
NSForegroundColorAttributeName: UIColor.lightGray,
NSFontAttributeName : UIFont.systemFont(ofSize: 12).traits(traits: .traitItalic)
]
label?.attributedText = partialHTMLString.htmlAttributedString(attributes: attributes)
Upvotes: 0
Reputation: 1817
The above answer in 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
}
Upvotes: 0
Reputation: 3311
Here is the swift 2 version:
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")
}
Upvotes: 2
Reputation: 9324
You can do it without any third-party libraries by using attributed text. I believe it does accept HTML fragments, like the one you're getting, but you may want to wrap it in a complete HTML document so that you can specify 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);
Not concise, but you can mop up the mess by adding a category to 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>"];
Upvotes: 102
Reputation: 1443
Use RTLabel library to convert the HTML text. I have used it several times. It works. Here is link to the library and a sample code.
https://github.com/honcheng/RTLabel.
Hope I helped.
Upvotes: 15
Reputation: 1281
From: https://stackoverflow.com/a/5581178/237838
To convert HTML to plain text Download File
and use
stringByConvertingHTMLToPlainText
function on your NSString
OR
You can use DTCoreText (previously known as NSAttributedString Additions for HTML).
Upvotes: 3