स्विफ्ट: एक लेबल या टेक्स्ट दृश्य में HTML डेटा प्रदर्शित करें


86

मेरे पास कुछ HTML डेटा हैं, जिसमें हेडिंग, पैराग्राफ, इमेज और लिस्ट टैग शामिल हैं।

क्या इस डेटा को एक UITextViewया एक में प्रदर्शित करने का कोई तरीका है UILabel?


1
UITextView या UILabel के बजाय UIWebView का उपयोग करें। तो यह छवियों सहित प्रदर्शित करेगा
टायसन विग्नेश

हां मुझे लगता है कि आप सही हैं @TysonVignesh
तल्हा अहमद खान

@TysonVignesh html प्रदर्शित करने के लिए मैं UIWebView का उपयोग कैसे कर सकता हूं?
मोहम्मद इज्जत

2
@MohamedEzzat इस लिंक को देखें hackingwithswift.com/example-code/uikit/…
Talha Ahmad Khan

जवाबों:


215

स्विफ्ट 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 ?? ""
    }
}

फिर, जब भी आप HTML टेक्स्ट को UITextView उपयोग में लाना चाहें:

textView.attributedText = htmlText.htmlToAttributedString

6
इसने मेरे लिए बहुत अच्छा काम किया, लेकिन मुझे इसकी जगह लेबल.attributedText का उपयोग करना पड़ा।
ब्रेंट वैगनर

महान! पूर्वी यूरोपीय लैटिन पत्रों के लिए मुझे सिर्फ एन्कोडिंग डेटा को यूनिकोड में बदलने की आवश्यकता थी।
nja

महान! लेकिन label.attributedText label.text होना चाहिए जब बुला
Sazzad Hissain खान

6
क्या यह छवियों को संरक्षित करना है?
daredevil1234

1
@Roger Carvalho: क्या इसमें निहित HTML टैग्स के लिए फ़ॉन्ट-परिवार, -साइज़ आदि को सेट करने का कोई तरीका है?
बर्नहार्ड एंगल

35

यहाँ एक स्विफ्ट 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 के कई लाइनों को स्कैन करने पर लेबल उचित रूप से आकार हो।


HTML की पार्स ... लेकिन गलत तरीके से। टैग अब दिखाई नहीं देते हैं, लेकिन बोल्ड टेक्स्ट प्रदर्शित नहीं होता है। मुझे नहीं पता कि कौन से टैग समर्थित हैं, शायद <b>नहीं है।
पाब्लो

बोल्ड टैग मेरे लिए ठीक काम करते हैं। क्या आप अपना पूर्ण HTML पोस्ट कर सकते हैं जो काम नहीं कर रहा है? हो सकता है कि आप जिस फॉन्ट का इस्तेमाल कर रहे हैं, वह बोल्ड न दिखे।
garie

Html एक CMS एडिटर का सिर्फ टेक्स्ट है, जो JSON स्ट्रिंग पर लौटने के लिए एन्कोडेड है। ऐप वेब सेवा का उपयोग करता है, JSON प्राप्त करता है जिसमें यह विशिष्ट टेक्स्ट ऑब्जेक्ट है - यहां क्लाइंट से आवश्यकता एक वेबसाइट के सीएमएस (वर्डप्रेस) के समान टेक्स्ट में html टैग जोड़ने की संभावना है। शायद मैं रिटर्न को गलत तरीके से एन्कोडिंग कर रहा हूं? जब मैं JSON पार्स करता हूं, तो मैं '<b> </ b>' सहित डिबग पर स्ट्रिंग रिटर्न प्रिंट करता हूं, लेकिन परीक्षणों के लिए एमुलेटर और डिवाइस दोनों पर, टैग काम नहीं करेंगे। मैं स्विफ्ट 3 का उपयोग कर रहा हूँ
पाब्लो

3
मैं कस्टम फ़ॉन्ट कैसे जोड़ सकता हूं?
भाविन रमणी

14

अपने 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

1
हां, लेकिन यह केवल HTML में पाठ के लिए काम करता है। मैं छवियों और सूचियों के बारे में भी चिंतित था। क्या छवियों और सूचियों को प्रदर्शित करने का कोई तरीका एकल वस्तु है ??
तल्हा अहमद खान

@ तलहाअमदखान आप सीधे यूआईवेबव्यू का उपयोग कर सकते हैं यदि आपके पास छवियां हैं। जैसा आप जानते हैं टेक्स्टव्यू या लेबल काम नहीं करेंगे।
साठे_नगराजा

8

मुझे उसके बाद पाठ की विशेषताओं को बदलने की समस्या थी, और मैं दूसरों से पूछ सकता था कि क्यों ...

इसके बजाय सबसे अच्छा जवाब 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
            }

मैं समान हासिल करना चाहता हूं लेकिन उपरोक्त कोड काम नहीं कर रहा है।
प्रत्यूष प्रातिक

7

स्विफ्ट 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

6

मैं इसका उपयोग कर रहा हूं:

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
        }
    }
}

1
यह अच्छा है लेकिन केवल यूआईबेल पर लागू होगा। यह बहुत बेहतर होगा यदि यह जेनेरिक एक्सटेंशन है जो html लेना चाहिए और इसे जिम्मेदार पाठ में बदलना चाहिए।
आई। सैफ्नूर

4

स्विफ्ट 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 ?? ""
 }
}

1
स्विफ्ट 3.1 NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue
Aksoy कर सकते हैं

4

स्विफ्ट 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


3

स्विफ्ट 5 के लिए, यह सीएसएस को भी लोड कर सकता है।

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&#33;&#33;&#33;".convertHtmlToAttributedStringWithCSS(font: UIFont(name: "Arial", size: 16), csscolor: "black", lineheight: 5, csstextalign: "center")

यहां छवि विवरण दर्ज करें यहाँ हर पैरामीटर क्या है:

  • फ़ॉन्ट: अपना फ़ॉन्ट जोड़ें जैसा कि आमतौर पर एक UILabel / UITextView में होता है, अपने कस्टम फ़ॉन्ट और आकार के नाम के साथ UIFont का उपयोग करते हुए।
  • csscolor: या तो "# 000000" जैसे HEX प्रारूप में रंग जोड़ें, या "काला" जैसे रंग के नाम का उपयोग करें।
  • लाइनहाइट: यह लाइनों के बीच का स्थान है जब आपके पास एक यूआईलेबेल / यूआईटैक्स व्यू में कई लाइनें होती हैं।
  • csstextalign: यह पाठ का संरेखण है, जो मूल्य आपको जोड़ने की आवश्यकता है वह "बाएं" या "दाएं" या "केंद्र" या "औचित्य" है

संदर्भ: https://johncodeos.com/how-to-display-html-in-uitextview-uilabel-with-custom-color-font-etc-in-ios-use-swift/


2

इसे इस्तेमाल करे:

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 ""
    }

आशा है कि इसके सहायक।


हां, लेकिन यह केवल HTML में पाठ के लिए काम करता है। मैं छवियों और सूचियों के बारे में भी चिंतित था। क्या छवियों और सूचियों को प्रदर्शित करने का कोई तरीका एकल वस्तु है ??
तल्हा अहमद खान

3
यह ध्यान देने योग्य है कि का उपयोग कर NSHTMLTextDocumentTypeरहा है अविश्वसनीय रूप से धीमी गति से [1]। कोशिश करें और इसके बजाय DDHTML जैसी लाइब्रेरी का उपयोग करें । [१] robpeck.com/2015/04/nshtmltextdocumenttype-is-slow
क्रिस्टोफर केविन हॉवेल

2

उपरोक्त उत्तर के लिए 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 ?? ""
    }
}

1

यदि आप HTML, छवियों और एक सूची के साथ चाहते हैं, तो यह UILabel द्वारा समर्थित नहीं है। हालाँकि, मैंने पाया है कि YYText ट्रिक करता है।


यदि आप स्ट्रिंग को ठीक से एन्कोड करते हैं तो यह समर्थित है। HTML के लिए एक
एसेटेड स्ट्रिंग

1

प्रदर्शन चित्र और पाठ पैराग्राफ एक में संभव नहीं है UITextViewया UILabel, इस के लिए, आप एक का उपयोग करना चाहिए UIWebView

बस स्टोरीबोर्ड में आइटम जोड़ें, अपने कोड से लिंक करें, और URL लोड करने के लिए इसे कॉल करें।

Obj सी

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/


दोनों में यह संभव है। स्ट्रिंग को बस ठीक से एनकोड करने की आवश्यकता है
फ्रेंगोमाड

1

स्विफ्ट 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()

0

मुझे पता है कि यह शीर्ष पर बहुत कम लगेगा लेकिन ... यह कोड 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 }
}

-1

यदि आप 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.