NSAttributedText में HTML पार्स करना - फ़ॉन्ट कैसे सेट करें?


133

मैं एक UITableViewell में iPhone पर अच्छी तरह से प्रदर्शित करने के लिए HTML में स्वरूपित पाठ का एक स्निपेट प्राप्त करने का प्रयास कर रहा हूं।

अब तक मेरे पास यह है:

NSError* error;
NSString* source = @"<strong>Nice</strong> try, Phil";
NSMutableAttributedString* str = [[NSMutableAttributedString alloc] initWithData:[source dataUsingEncoding:NSUTF8StringEncoding]
                                                           options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                                                     NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]}
                                                              documentAttributes:nil error:&error];

इस तरह के काम करता है। मुझे कुछ ऐसे टेक्स्ट मिलते हैं जिनमें बोल्ड 'नाइस' है! लेकिन ... यह टाइम्स रोमन होने के लिए फ़ॉन्ट भी सेट करता है! यह फॉन्ट फेस नहीं है जो मैं चाहता हूं। मैं सोच रहा हूं कि मुझे डॉक्यूमेंट में कुछ सेट करने की जरूरत है। लेकिन, मुझे कहीं भी कोई उदाहरण नहीं मिल रहा है।


1
नोट: NSHTMLTextDocumentType संभावित रूप से धीमा हो सकता है। देखें stackoverflow.com/questions/21166752/…
finneycanhelp

महत्वपूर्ण: यदि आप कस्टम फ़ॉन्ट का उपयोग कर रहे हैं, तो आपको यह उत्तर देखने की आवश्यकता है stackoverflow.com/a/60786178/1223897
युवराजसिंह

जवाबों:


118

जेवियर क्वेरोल द्वारा दिए गए जवाब के आधार पर स्विफ्ट 2 संस्करण

extension UILabel {
    func setHTMLFromString(text: String) {
        let modifiedFont = NSString(format:"<span style=\"font-family: \(self.font!.fontName); font-size: \(self.font!.pointSize)\">%@</span>", text) as String

        let attrStr = try! NSAttributedString(
            data: modifiedFont.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
            options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding],
            documentAttributes: nil)

        self.attributedText = attrStr
    }
}

स्विफ्ट 3.0 और आईओएस 9+

extension UILabel {
    func setHTMLFromString(htmlText: String) {
        let modifiedFont = String(format:"<span style=\"font-family: '-apple-system', 'HelveticaNeue'; font-size: \(self.font!.pointSize)\">%@</span>", htmlText)

        let attrStr = try! NSAttributedString(
            data: modifiedFont.data(using: .unicode, allowLossyConversion: true)!,
            options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue],
            documentAttributes: nil)

        self.attributedText = attrStr
    }
}

स्विफ्ट 5 और आईओएस 11+

extension UILabel {
    func setHTMLFromString(htmlText: String) {
        let modifiedFont = String(format:"<span style=\"font-family: '-apple-system', 'HelveticaNeue'; font-size: \(self.font!.pointSize)\">%@</span>", htmlText)

        let attrStr = try! NSAttributedString(
            data: modifiedFont.data(using: .unicode, allowLossyConversion: true)!,
            options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding:String.Encoding.utf8.rawValue],
            documentAttributes: nil)

        self.attributedText = attrStr
    }
}

1
वर्तमान फ़ॉन्ट नहीं बदल रहा है, यह वही है जो मैं खोज रहा था, धन्यवाद आदमी!
मोहम्मद ज़ैद पठान

2
यह काम। आप संशोधित स्ट्रिंग को एक स्ट्रिंग पर तुरंत सेट कर सकते हैं और NSString आरंभीकरण को छोड़ सकते हैं अर्थात "<span style = \" font-family: (self.font! .FontName); फ़ॉन्ट-आकार: (self.font!! .pointSize) \ "> (पाठ) </ अवधि>"
मैथ्यू कोरपोराल

2
यह काम करने के लिए, (जो वास्तव में अच्छी तरह से काम करता है) मुझे फ़ॉन्ट-पारिवारिक मूल्य के चारों ओर एकल उद्धरण जोड़ना था, इसलिए <div style = \ "font-family: '(self.font .fontName)'; ....;
गेराल्डकोर

4
मुझे लगता है, iOS9 के बाद से, इसका उपयोग करना सबसे अच्छा है font-family: '-apple-system', 'HelveticaNeue';(जो काम करता है, और पीछे की ओर संगत भी है)। यदि आप केवल iOS9 का समर्थन करते font-family: -apple-system;हैं तो इसका इस्तेमाल किया जा सकता है
डैनियल

1
इसके अलावा टेक्स्ट टेक्स्ट को सेट करने की क्षमता है, बस हेक्स स्ट्रिंग प्रारूप में मूल्य के साथ शैली विशेषता में रंग जोड़ें color: #000000। UIColor को hex string में बदलने के लिए यह लिंक देखें: gist.github.com/yannickl/16f0ed38f0698d9a8ae7
Miroslav Hrivik

115
#import "UILabel+HTML.h"

@implementation UILabel (HTML)

- (void)jaq_setHTMLFromString:(NSString *)string {

    string = [string stringByAppendingString:[NSString stringWithFormat:@"<style>body{font-family: '%@'; font-size:%fpx;}</style>",
                                              self.font.fontName,
                                              self.font.pointSize]];
    self.attributedText = [[NSAttributedString alloc] initWithData:[string dataUsingEncoding:NSUnicodeStringEncoding]
                                                           options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                                                     NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)}
                                                documentAttributes:nil
                                                             error:nil];
}


@end

इस तरह आपको यह निर्दिष्ट करने की आवश्यकता नहीं है कि आपको कौन सा फ़ॉन्ट चाहिए, यह लेबल फ़ॉन्ट और आकार लेगा।


2
यह बहुत खूबसूरत है!
मर्लेवेड

2
अच्छा लगा। हालांकि यह NSAttributedString imo पर एक श्रेणी के रूप में अधिक समझ में आता है।
दिमित्रिस

@ जेवियर क्वेरोल फिर लिंक क्लिंक को कैसे संभालना है?
करेनअन

आप स्ट्रिंग को डेटा के साथ NSUnicodeStringEncodingएनकोड करते हैं और फिर डेटा को वापस वर्णों के साथ एन्कोड करते हैं NSUTF8StringEncoding। ठीक है न?
तैमूर बर्निकोविच

1
क्षमा करें - यह समाधान मेरे लिए काम नहीं करता है, फ़ॉन्ट वांछित फ़ॉन्ट पर सेट नहीं है। - self.font.fontName का उपयोग करने के बजाय और self.font.familyName का उपयोग करने के बजाय वांछित फ़ॉन्ट सेट करें लेकिन फिर HTML टैग संरक्षित नहीं हैं। नीचे दिए गए समाधान देखें जो काम करता है और किसी भी तरह की HTML शैलियों का उपयोग करने पर निर्भर नहीं करता है। -राह
रिची हयात

49

मुझे वास्तव में इस समस्या का हल मिल गया:

अपने HTML प्रतिक्रिया स्ट्रिंग में फ़ॉन्ट बदलने से पहले यह पार्स हो जाता है।

NSString *aux = [NSString stringWithFormat:@"<span style=\"font-family: YOUR_FONT_NAME; font-size: SIZE\">%@</span>", htmlResponse];

उदाहरण:

NSString *aux = [NSString stringWithFormat:@"<span style=\"font-family: HelveticaNeue-Thin; font-size: 17\">%@</span>", [response objectForKey:@"content"]];

स्विफ्ट संस्करण:

let aux = "<span style=\"font-family: YOUR_FONT_NAME; font-size: SIZE\">\(htmlResponse)</span>"

4
सबसे आसान समाधान .. अन्य उत्तर सही हो सकते हैं लेकिन चीजें करना कठिन तरीके से स्मार्ट नहीं है .. :)
समीरा चतुरंगा

2
सर्वश्रेष्ठ और स्मार्ट उत्तर
तारिक

होशियार जवाब, सहमत! चीयर्स
जिम टिएरेनी

हैलो, वास्तव में यह बहुत अच्छा काम करता है, लेकिन अगर मैं इस जिम्मेदार पाठ को html में परिवर्तित करता हूं, तो फ़ॉन्ट का आकार उस HTML में बढ़ रहा है
मेहुल ठक्कर

1
वास्तव में stackoverflow पर अन्य पदों से मदद से .. मैं html और अनुप्रयुक्त पाठ को फ़ॉन्ट आकार के अलावा ठीक काम करने में सक्षम करने में सक्षम हूं, जो कि लगभग दोगुना हो रहा है
मेहुल ठक्कर

41

पता लगा लिया। एक भालू के बिट, और शायद सबसे अच्छा जवाब नहीं।

यह कोड सभी फ़ॉन्ट परिवर्तनों से गुजरेगा। मुझे पता है कि यह फोंट के लिए "टाइम्स न्यू रोमन" और "टाइम्स न्यू रोमन बोल्डएमटी" का उपयोग कर रहा है। लेकिन परवाह किए बिना, यह बोल्ड फोंट मिलेगा और मुझे उन्हें रीसेट करने देगा। जब मैं उस पर होता हूं, तो मैं आकार भी रीसेट कर सकता हूं।

मैं ईमानदारी से आशा / विचार करता हूं कि इसे पार्स समय पर सेट करने का एक तरीका है, लेकिन अगर है तो मैं इसे नहीं पा सकता हूं।

    NSRange range = (NSRange){0,[str length]};
    [str enumerateAttribute:NSFontAttributeName inRange:range options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(id value, NSRange range, BOOL *stop) {
        UIFont* currentFont = value;
        UIFont *replacementFont = nil;

        if ([currentFont.fontName rangeOfString:@"bold" options:NSCaseInsensitiveSearch].location != NSNotFound) {
            replacementFont = [UIFont fontWithName:@"HelveticaNeue-CondensedBold" size:25.0f];
        } else {
            replacementFont = [UIFont fontWithName:@"HelveticaNeue-Thin" size:25.0f];
        }

        [str addAttribute:NSFontAttributeName value:replacementFont range:range];
    }];

2
फ़ॉन्ट नाम में "बोल्ड" शब्द की तलाश एक भयानक कीचड़ है! यह अन्य फ़ॉन्ट विशेषताओं जैसे इटैलिक को भी तोड़ता है।
हुगहुगेटोटल

1
एक और अधिक सामान्य दृष्टिकोण यह है कि एन्यूमरेट करते समय फ़ॉन्ट लक्षणों को देखें, और समान लक्षणों के साथ एक फ़ॉन्ट बनाएं। मैं नीचे अपना कोड पोस्ट करूँगा।
14

33

एक अधिक सामान्य दृष्टिकोण यह है कि फ़ॉन्ट गुण को एनुमरेट करते समय देखा जाए, और समान लक्षण (बोल्ड, इटैलिक, इत्यादि) के साथ एक फ़ॉन्ट बनाएं:

extension NSMutableAttributedString {

    /// Replaces the base font (typically Times) with the given font, while preserving traits like bold and italic
    func setBaseFont(baseFont: UIFont, preserveFontSizes: Bool = false) {
        let baseDescriptor = baseFont.fontDescriptor
        let wholeRange = NSRange(location: 0, length: length)
        beginEditing()
        enumerateAttribute(.font, in: wholeRange, options: []) { object, range, _ in
            guard let font = object as? UIFont else { return }
            // Instantiate a font with our base font's family, but with the current range's traits
            let traits = font.fontDescriptor.symbolicTraits
            guard let descriptor = baseDescriptor.withSymbolicTraits(traits) else { return }
            let newSize = preserveFontSizes ? descriptor.pointSize : baseDescriptor.pointSize
            let newFont = UIFont(descriptor: descriptor, size: newSize)
            self.removeAttribute(.font, range: range)
            self.addAttribute(.font, value: newFont, range: range)
        }
        endEditing()
    }
}

हालांकि यह बहुत संक्षिप्त नहीं है, यह HTML को अधिक html के साथ रैप करने के साथ समस्या के आसपास हैकिंग की तुलना में अधिक स्थिर लगता है।
syvex

23

हां, एक आसान उपाय है। HTML स्रोत में फ़ॉन्ट सेट करें!

NSError* error;
NSString* source = @"<strong>Nice</strong> try, Phil";
source = [source stringByAppendingString:@"<style>strong{font-family: 'Avenir-Roman';font-size: 14px;}</style>"];
NSMutableAttributedString* str = [[NSMutableAttributedString alloc] initWithData:[source dataUsingEncoding:NSUTF8StringEncoding]
                                                           options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                                                     NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]}
                                                              documentAttributes:nil error:&error];

उम्मीद है की यह मदद करेगा।


23

यूआईबेल एक्सटेंशन का स्विफ्ट 4+ अपडेट

extension UILabel {
    func setHTMLFromString(text: String) {
        let modifiedFont = NSString(format:"<span style=\"font-family: \(self.font!.fontName); font-size: \(self.font!.pointSize)\">%@</span>" as NSString, text)

        let attrStr = try! NSAttributedString(
            data: modifiedFont.data(using: String.Encoding.unicode.rawValue, allowLossyConversion: true)!,
            options: [NSAttributedString.DocumentReadingOptionKey.documentType:NSAttributedString.DocumentType.html, NSAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue],
            documentAttributes: nil)

        self.attributedText = attrStr
    }
}

iOS 9+

extension UILabel {
    func setHTMLFromString(htmlText: String) {
        let modifiedFont = NSString(format:"<span style=\"font-family: '-apple-system', 'HelveticaNeue'; font-size: \(self.font!.pointSize)\">%@</span>" as NSString, htmlText) as String


        //process collection values
        let attrStr = try! NSAttributedString(
            data: modifiedFont.data(using: .unicode, allowLossyConversion: true)!,
            options: [NSAttributedString.DocumentReadingOptionKey.documentType:NSAttributedString.DocumentType.html, NSAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue],
            documentAttributes: nil)


        self.attributedText = attrStr
    }
}

8

यदि आप एक ही समय में रूपांतरण कर रहे हैं तो सभी उत्तर ठीक हैं NSAttributedString। लेकिन मुझे लगता है कि एक बेहतर समाधान, जो स्ट्रिंग पर ही काम करता है और इसलिए इनपुट तक पहुंच की आवश्यकता नहीं है, निम्न श्रेणी है:

extension NSMutableAttributedString
{
    func convertFontTo(font: UIFont)
    {
        var range = NSMakeRange(0, 0)

        while (NSMaxRange(range) < length)
        {
            let attributes = attributesAtIndex(NSMaxRange(range), effectiveRange: &range)
            if let oldFont = attributes[NSFontAttributeName]
            {
                let newFont = UIFont(descriptor: font.fontDescriptor().fontDescriptorWithSymbolicTraits(oldFont.fontDescriptor().symbolicTraits), size: font.pointSize)
                addAttribute(NSFontAttributeName, value: newFont, range: range)
            }
        }
    }
}

इस रूप में उपयोग करें:

let desc = NSMutableAttributedString(attributedString: *someNSAttributedString*)
desc.convertFontTo(UIFont.systemFontOfSize(16))

IOS 7+ पर काम करता है


इसके लिए हर जगह की तलाश की ... !! धन्यवाद..!
इरशाद कुरैशी

5

रंग सहित विक्टर के समाधान पर सुधार:

extension UILabel {
      func setHTMLFromString(text: String) {
          let modifiedFont = NSString(format:"<span style=\"color:\(self.textColor.toHexString());font-family: \(self.font!.fontName); font-size: \(self.font!.pointSize)\">%@</span>", text) as String

          let attrStr = try! NSAttributedString(
              data: modifiedFont.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
              options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding],
              documentAttributes: nil)

          self.attributedText = attrStr
      }
  }

इस काम के लिए आपको YLColor.swift को uicolor की hex रूपांतरण की आवश्यकता भी होगी https://gist.github.com/yannickl/16f0ed38f0698d9a8ae7


4

NSHTMLTextDocumentType का उपयोग शैलियों को नियंत्रित करने के लिए धीमा और कठिन है। मैं आपको सुझाव देता हूं कि आप मेरी लाइब्रेरी को आजमाएं, जिसे एतवेनिका कहा जाता है। इसका अपना बहुत तेज पार्सर है। इसके अलावा, आपके पास कोई भी टैग नाम हो सकता है और उनके लिए किसी भी शैली को परिभाषित कर सकता है।

उदाहरण:

let str = "<strong>Nice</strong> try, Phil".style(tags:
    Style("strong").font(.boldSystemFont(ofSize: 15))).attributedString

label.attributedText = str

आप इसे यहां पा सकते हैं https://github.com/psharanda/Atributika


4

सभी के उत्तरों को एक साथ जोड़ते हुए, मैंने दो एक्सटेंशन किए जो html टेक्स्ट के साथ एक लेबल सेट करने की अनुमति देते हैं। ऊपर दिए गए कुछ जवाबों ने जिम्मेदार तार में फ़ॉन्ट परिवार की सही ढंग से व्याख्या नहीं की। अन्य मेरी जरूरतों के लिए अधूरे थे या अन्य तरीकों से असफल रहे। अगर आप मुझे सुधारना चाहते हैं तो मुझे कुछ बताएं।

मुझे उम्मीद है इससे किसी को सहायता मिलेगी।

extension UILabel {
    /// Sets the label using the supplied html, using the label's font and font size as a basis.
    /// For predictable results, using only simple html without style sheets.
    /// See /programming/19921972/parsing-html-into-nsattributedtext-how-to-set-font
    ///
    /// - Returns: Whether the text could be converted.
    @discardableResult func setAttributedText(fromHtml html: String) -> Bool {
        guard let data = html.data(using: .utf8, allowLossyConversion: true) else {
            print(">>> Could not create UTF8 formatted data from \(html)")
            return false
        }

        do {
            let mutableText = try NSMutableAttributedString(
                data: data,
                options: [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html, NSAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue],
                documentAttributes: nil)
            mutableText.replaceFonts(with: font)
            self.attributedText = mutableText
            return true
        } catch (let error) {
            print(">>> Could not create attributed text from \(html)\nError: \(error)")
            return false
        }
    }
}

extension NSMutableAttributedString {

    /// Replace any font with the specified font (including its pointSize) while still keeping
    /// all other attributes like bold, italics, spacing, etc.
    /// See /programming/19921972/parsing-html-into-nsattributedtext-how-to-set-font
    func replaceFonts(with font: UIFont) {
        let baseFontDescriptor = font.fontDescriptor
        var changes = [NSRange: UIFont]()
        enumerateAttribute(.font, in: NSMakeRange(0, length), options: []) { foundFont, range, _ in
            if let htmlTraits = (foundFont as? UIFont)?.fontDescriptor.symbolicTraits,
                let adjustedDescriptor = baseFontDescriptor.withSymbolicTraits(htmlTraits) {
                let newFont = UIFont(descriptor: adjustedDescriptor, size: font.pointSize)
                changes[range] = newFont
            }
        }
        changes.forEach { range, newFont in
            removeAttribute(.font, range: range)
            addAttribute(.font, value: newFont, range: range)
        }
    }
}

एकमात्र पूर्ण समाधान जो काम करता है UILabelऔर UITextView। धन्यवाद!
राडु उर्सचे

3

उत्तर के लिए धन्यवाद, मुझे वास्तव में विस्तार पसंद आया लेकिन मैंने अभी तक स्विफ्ट में परिवर्तित नहीं किया है। उद्देश्य-सी में अभी भी उन पुराने स्कूली छात्रों के लिए यह थोड़ा मदद करनी चाहिए: डी

-(void) setBaseFont:(UIFont*)font preserveSize:(BOOL) bPreserve {

UIFontDescriptor *baseDescriptor = font.fontDescriptor;

[self enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, [self length]) options:0 usingBlock:^(id  _Nullable value, NSRange range, BOOL * _Nonnull stop) {

    UIFont *font = (UIFont*)value;
    UIFontDescriptorSymbolicTraits traits = font.fontDescriptor.symbolicTraits;
    UIFontDescriptor *descriptor = [baseDescriptor fontDescriptorWithSymbolicTraits:traits];
    UIFont *newFont = [UIFont fontWithDescriptor:descriptor size:bPreserve?baseDescriptor.pointSize:descriptor.pointSize];

    [self removeAttribute:NSFontAttributeName range:range];
    [self addAttribute:NSFontAttributeName value:newFont range:range];

}];    } 

हैप्पी कोडिंग! -ग्राम फ्रेम


1
पुराने स्कूली छात्रों के लिए भगवान का शुक्र है! :-)
जोसेफ राइसेनक

1

स्विफ्ट 3 एक एनआईएल फ़ॉन्ट सहित स्ट्रिंग एक्सटेंशन। फ़ॉन्ट के बिना संपत्ति अन्य SO प्रश्न से ली गई है, याद नहीं है कि कौन सी :(

extension String {
    var html2AttributedString: NSAttributedString? {
        guard let data = data(using: .utf8) else {
            return nil
        }

        do {
            return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        }
        catch {
            print(error.localizedDescription)
            return nil
        }
    }

    public func getHtml2AttributedString(font: UIFont?) -> NSAttributedString? {
        guard let font = font else {
            return html2AttributedString
        }

        let modifiedString = "<style>body{font-family: '\(font.fontName)'; font-size:\(font.pointSize)px;}</style>\(self)";

        guard let data = modifiedString.data(using: .utf8) else {
            return nil
        }

        do {
            return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        }
        catch {
            print(error)
            return nil
        }
    }
}

0

यहाँ NSString के लिए एक एक्सटेंशन है जो ऑब्जेक्टिव-सी का उपयोग करके एक NSAttributedString लौटाता है।

यह HTML टैग्स के साथ एक स्ट्रिंग को सही ढंग से हैंडल करता है और BOLD, ITALICS सहित HTML टैग्स को संरक्षित करते हुए वांछित फ़ॉन्ट और फ़ॉन्ट रंग सेट करता है ...

सभी के सर्वश्रेष्ठ यह फ़ॉन्ट विशेषताओं को सेट करने के लिए किसी भी HTML मार्कर पर निर्भर नहीं करता है।

@implementation NSString (AUIViewFactory)

- (NSAttributedString*)attributedStringFromHtmlUsingFont:(UIFont*)font fontColor:(UIColor*)fontColor
{
    NSMutableAttributedString* mutableAttributedString = [[[NSAttributedString alloc] initWithData:[self dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute : @(NSUTF8StringEncoding)} documentAttributes:nil error:nil] mutableCopy]; // parse text with html tags into a mutable attributed string
    [mutableAttributedString beginEditing];
    // html tags cause font ranges to be created, for example "This text is <b>bold</b> now." creates three font ranges: "This text is " , "bold" , " now."
    [mutableAttributedString enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, mutableAttributedString.length) options:0 usingBlock:^(id value, NSRange range, BOOL* stop)
    { // iterate every font range, change every font to new font but preserve symbolic traits such as bold and italic (underline and strikethorugh are preserved automatically), set font color
        if (value)
        {
            UIFont* oldFont = (UIFont*)value;
            UIFontDescriptor* fontDescriptor = [font.fontDescriptor fontDescriptorWithSymbolicTraits:oldFont.fontDescriptor.symbolicTraits];
            UIFont* newFont = [UIFont fontWithDescriptor:fontDescriptor size:font.pointSize];
            [mutableAttributedString removeAttribute:NSFontAttributeName range:range]; // remove the old font attribute from this range
            [mutableAttributedString addAttribute:NSFontAttributeName value:newFont range:range]; // add the new font attribute to this range
            [mutableAttributedString addAttribute:NSForegroundColorAttributeName value:fontColor range:range]; // set the font color for this range
        }
    }];
    [mutableAttributedString endEditing];
    return mutableAttributedString;
}

@end

-3

दरअसल, इससे भी आसान और साफ तरीका मौजूद है। बस HTML को पार्स करने के बाद फ़ॉन्ट सेट करें:

 NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding]
                                                                     options:@{
                                                                               NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                                                                               NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)}
                                                          documentAttributes:nil error:nil];
    [text addAttributes:@{NSFontAttributeName: [UIFont fontWithName:@"Lato-Regular" size:20]} range:NSMakeRange(0, text.length)];

14
वह काम करता है, लेकिन आप बोल्ड और इटैलिक <b> और <u> खो देंगे क्योंकि वे फ़ॉन्ट द्वारा ओवरराइट किए गए हैं।
मिस्टर ज़ीस्टम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.