제목, 단락, 이미지 및 목록 태그가 포함 된 HTML 데이터가 있습니다.
이 데이터를 하나 UITextView
또는 하나에 표시하는 방법이 UILabel
있습니까?
제목, 단락, 이미지 및 목록 태그가 포함 된 HTML 데이터가 있습니다.
이 데이터를 하나 UITextView
또는 하나에 표시하는 방법이 UILabel
있습니까?
답변:
Swift 5 :
extension String {
var htmlToAttributedString: NSAttributedString? {
guard let data = data(using: .utf8) else { return nil }
do {
return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding:String.Encoding.utf8.rawValue], documentAttributes: nil)
} catch {
return nil
}
}
var htmlToString: String {
return htmlToAttributedString?.string ?? ""
}
}
그런 다음 UITextView에 HTML 텍스트를 넣고 싶을 때마다 다음을 사용하십시오.
textView.attributedText = htmlText.htmlToAttributedString
다음은 Swift 3 버전입니다.
private func getHtmlLabel(text: String) -> UILabel {
let label = UILabel()
label.numberOfLines = 0
label.lineBreakMode = .byWordWrapping
label.attributedString = stringFromHtml(string: text)
return label
}
private func stringFromHtml(string: String) -> NSAttributedString? {
do {
let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
if let d = data {
let str = try NSAttributedString(data: d,
options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil)
return str
}
} catch {
}
return nil
}
여기에서 다른 답변 중 일부에서 문제를 발견했으며이 문제를 해결하는 데 약간의 시간이 걸렸습니다. HTML이 여러 줄에 걸쳐있을 때 레이블 크기가 적절하도록 줄 바꿈 모드와 줄 수를 설정했습니다.
<b>
있습니다.
이 확장을 추가하여 html 코드를 일반 문자열로 변환하십시오.
extension String {
var html2AttributedString: NSAttributedString? {
guard
let data = dataUsingEncoding(NSUTF8StringEncoding)
else { return nil }
do {
return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:NSUTF8StringEncoding], documentAttributes: nil)
} catch let error as NSError {
print(error.localizedDescription)
return nil
}
}
var html2String: String {
return html2AttributedString?.string ?? ""
}
}
그런 다음 UITextView 또는 UILabel 안에 문자열을 표시합니다.
textView.text = yourString.html2String
또는
label.text = yourString.html2String
그 후 텍스트 속성을 변경하는 데 문제가 있었고 다른 사람들이 이유를 묻는 것을 볼 수있었습니다 ...
따라서 가장 좋은 대답은 대신 NSMutableAttributedString과 함께 확장을 사용하는 것입니다.
extension String {
var htmlToAttributedString: NSMutableAttributedString? {
guard let data = data(using: .utf8) else { return nil }
do {
return try NSMutableAttributedString(data: data,
options: [.documentType: NSMutableAttributedString.DocumentType.html,
.characterEncoding: String.Encoding.utf8.rawValue],
documentAttributes: nil)
} catch let error as NSError {
print(error.localizedDescription)
return nil
}
}
}
그런 다음 다음과 같이 사용할 수 있습니다.
if let labelTextFormatted = text.htmlToAttributedString {
let textAttributes = [
NSAttributedStringKey.foregroundColor: UIColor.white,
NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 13)
] as [NSAttributedStringKey: Any]
labelTextFormatted.addAttributes(textAttributes, range: NSRange(location: 0, length: labelTextFormatted.length))
self.contentText.attributedText = labelTextFormatted
}
스위프트 3.0
var attrStr = try! NSAttributedString(
data: "<b><i>text</i></b>".data(using: String.Encoding.unicode, allowLossyConversion: true)!,
options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil)
label.attributedText = attrStr
나는 이것을 사용하고있다 :
extension UILabel {
func setHTML(html: String) {
do {
let attributedString: NSAttributedString = try NSAttributedString(data: html.data(using: .utf8)!, options: [NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType], documentAttributes: nil)
self.attributedText = attributedString
} catch {
self.text = html
}
}
}
스위프트 3
extension String {
var html2AttributedString: NSAttributedString? {
guard
let data = data(using: String.Encoding.utf8)
else { return nil }
do {
return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:String.Encoding.utf8], documentAttributes: nil)
} catch let error as NSError {
print(error.localizedDescription)
return nil
}
}
var html2String: String {
return html2AttributedString?.string ?? ""
}
}
스위프트 5
extension UIColor {
var hexString: String {
let components = cgColor.components
let r: CGFloat = components?[0] ?? 0.0
let g: CGFloat = components?[1] ?? 0.0
let b: CGFloat = components?[2] ?? 0.0
let hexString = String(format: "#%02lX%02lX%02lX", lroundf(Float(r * 255)), lroundf(Float(g * 255)),
lroundf(Float(b * 255)))
return hexString
}
}
extension String {
func htmlAttributed(family: String?, size: CGFloat, color: UIColor) -> NSAttributedString? {
do {
let htmlCSSString = "<style>" +
"html *" +
"{" +
"font-size: \(size)pt !important;" +
"color: #\(color.hexString) !important;" +
"font-family: \(family ?? "Helvetica"), Helvetica !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
}
}
}
마지막으로 UILabel을 만들 수 있습니다.
func createHtmlLabel(with html: String) -> UILabel {
let htmlMock = """
<b>hello</b>, <i>world</i>
"""
let descriprionLabel = UILabel()
descriprionLabel.attributedText = htmlMock.htmlAttributed(family: "YourFontFamily", size: 15, color: .red)
return descriprionLabel
}
결과:
튜토리얼보기 :
https://medium.com/@valv0/a-swift-extension-for-string-and-html-8cfb7477a510
Swift 5의 경우 CSS를로드 할 수도 있습니다.
extension String {
public var convertHtmlToNSAttributedString: NSAttributedString? {
guard let data = data(using: .utf8) else {
return nil
}
do {
return try NSAttributedString(data: data,options: [.documentType: NSAttributedString.DocumentType.html,.characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
}
catch {
print(error.localizedDescription)
return nil
}
}
public func convertHtmlToAttributedStringWithCSS(font: UIFont? , csscolor: String , lineheight: Int, csstextalign: String) -> NSAttributedString? {
guard let font = font else {
return convertHtmlToNSAttributedString
}
let modifiedString = "<style>body{font-family: '\(font.fontName)'; font-size:\(font.pointSize)px; color: \(csscolor); line-height: \(lineheight)px; text-align: \(csstextalign); }</style>\(self)";
guard let data = modifiedString.data(using: .utf8) else {
return nil
}
do {
return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
}
catch {
print(error)
return nil
}
}
}
그런 다음 NSAttributedString으로 변환하려는 문자열로 이동하여 아래 예제와 같이 배치하십시오.
myUILabel.attributedText = "Swift is awesome!!!".convertHtmlToAttributedStringWithCSS(font: UIFont(name: "Arial", size: 16), csscolor: "black", lineheight: 5, csstextalign: "center")
이 시도:
let label : UILable! = String.stringFromHTML("html String")
func stringFromHTML( string: String?) -> String
{
do{
let str = try NSAttributedString(data:string!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true
)!, options:[NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSNumber(unsignedLong: NSUTF8StringEncoding)], documentAttributes: nil)
return str.string
} catch
{
print("html error\n",error)
}
return ""
}
도움이 되었기를 바랍니다.
NSHTMLTextDocumentType
은 엄청나게 느립니다 [1]. 대신 DDHTML 과 같은 라이브러리를 사용해보십시오 . [1] robpeck.com/2015/04/nshtmltextdocumenttype-is-slow
위의 답변에 대한 Thx는 Swift 4.2입니다.
extension String {
var htmlToAttributedString: NSAttributedString? {
guard
let data = self.data(using: .utf8)
else { return nil }
do {
return try NSAttributedString(data: data, options: [
NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html,
NSAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue
], documentAttributes: nil)
} catch let error as NSError {
print(error.localizedDescription)
return nil
}
}
var htmlToString: String {
return htmlToAttributedString?.string ?? ""
}
}
UITextView
또는 UILabel
에서는 이미지 및 텍스트 단락을 표시 할 수 없으므로 UIWebView
.
스토리 보드에 항목을 추가하고 코드에 연결 한 다음 호출하여 URL을로드하면됩니다.
OBJ-C
NSString *fullURL = @"http://conecode.com";
NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[_viewWeb loadRequest:requestObj];
빠른
let url = NSURL (string: "http://www.sourcefreeze.com");
let requestObj = NSURLRequest(URL: url!);
viewWeb.loadRequest(requestObj);
단계별 튜토리얼. http://sourcefreeze.com/uiwebview-example-using-swift-in-ios/
스위프트 5
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
}
}
요구:
myLabel.attributedText = "myString".htmlAttributedString()
나는이 맨 위에 조금 보이는 것하지만 ... 알고 이 코드는 UILabel의, UITextView,있는 UIButton에 HTML 지원을 추가 할 것입니다 그리고 당신은 쉽게 문자열 지원에 기인 한 모든보기에이 지원을 추가 할 수 있습니다 :
public protocol CSHasAttributedTextProtocol: AnyObject {
func attributedText() -> NSAttributedString?
func attributed(text: NSAttributedString?) -> Self
}
extension UIButton: CSHasAttributedTextProtocol {
public func attributedText() -> NSAttributedString? {
attributedTitle(for: .normal)
}
public func attributed(text: NSAttributedString?) -> Self {
setAttributedTitle(text, for: .normal); return self
}
}
extension UITextView: CSHasAttributedTextProtocol {
public func attributedText() -> NSAttributedString? { attributedText }
public func attributed(text: NSAttributedString?) -> Self { attributedText = text; return self }
}
extension UILabel: CSHasAttributedTextProtocol {
public func attributedText() -> NSAttributedString? { attributedText }
public func attributed(text: NSAttributedString?) -> Self { attributedText = text; return self }
}
public extension CSHasAttributedTextProtocol
where Self: CSHasFontProtocol, Self: CSHasTextColorProtocol {
@discardableResult
func html(_ text: String) -> Self { html(text: text) }
@discardableResult
func html(text: String) -> Self {
let html = """
<html><body style="color:\(textColor!.hexValue()!);
font-family:\(font()!.fontName);
font-size:\(font()!.pointSize);">\(text)</body></html>
"""
html.data(using: .unicode, allowLossyConversion: true).notNil { data in
attributed(text: try? NSAttributedString(data: data, options: [
.documentType: NSAttributedString.DocumentType.html,
.characterEncoding: NSNumber(value: String.Encoding.utf8.rawValue)
], documentAttributes: nil))
}
return self
}
}
public protocol CSHasFontProtocol: AnyObject {
func font() -> UIFont?
func font(_ font: UIFont?) -> Self
}
extension UIButton: CSHasFontProtocol {
public func font() -> UIFont? { titleLabel?.font }
public func font(_ font: UIFont?) -> Self { titleLabel?.font = font; return self }
}
extension UITextView: CSHasFontProtocol {
public func font() -> UIFont? { font }
public func font(_ font: UIFont?) -> Self { self.font = font; return self }
}
extension UILabel: CSHasFontProtocol {
public func font() -> UIFont? { font }
public func font(_ font: UIFont?) -> Self { self.font = font; return self }
}
public protocol CSHasTextColorProtocol: AnyObject {
func textColor() -> UIColor?
func text(color: UIColor?) -> Self
}
extension UIButton: CSHasTextColorProtocol {
public func textColor() -> UIColor? { titleColor(for: .normal) }
public func text(color: UIColor?) -> Self { setTitleColor(color, for: .normal); return self }
}
extension UITextView: CSHasTextColorProtocol {
public func textColor() -> UIColor? { textColor }
public func text(color: UIColor?) -> Self { textColor = color; return self }
}
extension UILabel: CSHasTextColorProtocol {
public func textColor() -> UIColor? { textColor }
public func text(color: UIColor?) -> Self { textColor = color; return self }
}
내부에 HTML 코드가 포함 된 문자열이있는 경우 다음을 사용할 수 있습니다.
extension String {
var utfData: Data? {
return self.data(using: .utf8)
}
var htmlAttributedString: NSAttributedString? {
guard let data = self.utfData else {
return nil
}
do {
return try NSAttributedString(data: data,
options: [
.documentType: NSAttributedString.DocumentType.html,
.characterEncoding: String.Encoding.utf8.rawValue
], documentAttributes: nil)
} catch {
print(error.localizedDescription)
return nil
}
}
var htmlString: String {
return htmlAttributedString?.string ?? self
}
}
그리고 귀하가 사용하는 코드에서 :
label.text = "something".htmlString