Ich habe einige HTML-Daten, die Überschriften, Absätze, Bilder und Listen-Tags enthalten.
Gibt es eine Möglichkeit, diese Daten in einem UITextView
oder UILabel
mehreren anzuzeigen ?
html
ios
swift
uitextview
nsattributedstring
Talha Ahmad Khan
quelle
quelle
Antworten:
Für 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 ?? "" } }
Wann immer Sie HTML-Text in eine UITextView einfügen möchten, verwenden Sie:
quelle
Hier ist eine Swift 3-Version:
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 }
Ich habe hier Probleme mit einigen der anderen Antworten gefunden und es hat ein bisschen gedauert, bis ich das richtig verstanden habe. Ich habe den Zeilenumbruchmodus und die Anzahl der Zeilen so eingestellt, dass die Größe des Etiketts angemessen ist, wenn der HTML-Code mehrere Zeilen umfasst.
quelle
<b>
nicht.Fügen Sie diese Erweiterung hinzu, um Ihren HTML-Code in eine reguläre Zeichenfolge zu konvertieren:
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 ?? "" } }
Und dann zeigen Sie Ihren String in einem UITextView oder UILabel
textView.text = yourString.html2String
oderquelle
Danach hatte ich Probleme, Textattribute zu ändern, und ich konnte sehen, wie andere fragten, warum ...
Die beste Antwort ist also, stattdessen die Erweiterung mit NSMutableAttributedString zu verwenden:
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 } } }
Und dann können Sie es so verwenden:
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 }
quelle
Swift 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
quelle
Ich benutze dies:
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 } } }
quelle
Swift 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 ?? "" } }
quelle
Swift 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 } } }
Und schließlich können Sie UILabel erstellen:
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 }
Ergebnis:
Siehe Tutorial:
https://medium.com/@valv0/a-swift-extension-for-string-and-html-8cfb7477a510
quelle
Versuche dies:
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 "" }
Hoffe es ist hilfreich.
quelle
NSHTMLTextDocumentType
ist unglaublich langsam [1]. Versuchen Sie stattdessen, eine Bibliothek wie DDHTML zu verwenden. [1] robpeck.com/2015/04/nshtmltextdocumenttype-is-slowDanke für die obige Antwort hier ist 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 ?? "" } }
quelle
Für Swift 5 kann auch CSS geladen werden.
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 } } }
Wechseln Sie danach zu Ihrer Zeichenfolge, die Sie in NSAttributedString konvertieren möchten, und platzieren Sie sie wie im folgenden Beispiel:
myUILabel.attributedText = "Swift is awesome!!!".convertHtmlToAttributedStringWithCSS(font: UIFont(name: "Arial", size: 16), csscolor: "black", lineheight: 5, csstextalign: "center")
Jeder Parameter benötigt Folgendes:
Referenz: https://johncodeos.com/how-to-display-html-in-uitextview-uilabel-with-custom-color-font-etc-in-ios-using-swift/
quelle
Wenn Sie HTML mit Bildern und einer Liste möchten, wird dies von UILabel nicht unterstützt. Ich habe jedoch festgestellt, dass YYText den Trick macht.
quelle
Das Anzeigen von Bildern und Textabschnitten ist in a nicht möglich
UITextView
oderUILabel
Sie müssen dazu a verwendenUIWebView
.Fügen Sie einfach das Element in das Storyboard ein, verknüpfen Sie es mit Ihrem Code und rufen Sie es auf, um die URL zu laden.
OBJ-C
NSString *fullURL = @"http://conecode.com"; NSURL *url = [NSURL URLWithString:fullURL]; NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; [_viewWeb loadRequest:requestObj];
Schnell
let url = NSURL (string: "http://www.sourcefreeze.com"); let requestObj = NSURLRequest(URL: url!); viewWeb.loadRequest(requestObj);
Schritt für Schritt Tutorial. http://sourcefreeze.com/uiwebview-example-using-swift-in-ios/
quelle
Swift 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 } }
Anruf:
myLabel.attributedText = "myString".htmlAttributedString()
quelle
Wenn Sie einen String mit HTML-Code im Inneren haben, können Sie Folgendes verwenden:
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 } }
UND IN IHREM CODE VERWENDEN SIE:
label.text = "something".htmlString
quelle