এইচটিএমএলকে এনএসএট্রিবিউটেড টেক্সটে পার্স করা - ফন্ট সেট করবেন কীভাবে?


133

আমি ইউআইটিএবলভিউসিলের আইফোনে সুন্দরভাবে প্রদর্শন করতে এইচটিএমএলে ফর্ম্যাট করা পাঠ্যের একটি স্নিপেট নেওয়ার চেষ্টা করছি।

এখনও পর্যন্ত আমার কাছে এটি রয়েছে:

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
দ্রষ্টব্য: এনএসএইচটিএমএলটিেক্সট ডকুমেন্ট টাইপ সম্ভাব্য ধীর হতে পারে। দেখুন stackoverflow.com/questions/21166752/...
finneycanhelp

গুরুত্বপূর্ণ: কাস্টম ফন্ট ব্যবহার করেন তাহলে আপনি এই উত্তর দেখতে প্রয়োজন stackoverflow.com/a/60786178/1223897
Yuvrajsinh

উত্তর:


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
এইটা কাজ করে. আপনি এখনই স্ট্রিংয়ে পরিবর্তিত স্ট্রিং সেট করতে পারেন এবং এনএসএসআর্টিং ইনিশিয়ালেশন যেমন "<স্প্যান শৈলী = \" ফন্ট-পরিবার: (স্ব.ফন্ট! .ফন্টনাম) বাদ দিতে পারেন; হরফ আকার: (স্ব.ফন্ট!। পয়েন্ট সাইজ) \ "> (পাঠ্য) </span>"
ম্যাথু করপোরাল

2
এই কাজটি করার জন্য, (যা সত্যই সত্যই ভাল কাজ করে) আমাকে ফন্ট-পরিবার মানের আশেপাশে একক উক্তি যোগ করতে হয়েছিল যাতে <div शैली = \ "ফন্ট-পরিবার: '(স্ব.ফন্ট! .ফন্টনাম)'; .... ....
geraldcor

4
আমি মনে করি, আইওএস 9-এর পর থেকে এটি ব্যবহার করা ভাল font-family: '-apple-system', 'HelveticaNeue';(যা কাজ করে এবং পিছনের দিকেও সামঞ্জস্যপূর্ণ)। আপনি যদি কেবল iOS9 সমর্থন করেন font-family: -apple-system;তবে ব্যবহার করতে পারেন
ড্যানিয়েল

1
সহজ হ'ল পাঠ্য রঙ সেট করার ক্ষমতা, হেক্স স্ট্রিং ফর্ম্যাটে মান সহ স্টাইল অ্যাট্রিবিউটে রঙ যুক্ত করুন color: #000000ইউআইকোলারকে
মিরোস্লাভ হ্রিভিক

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
খুশী হলাম। যদিও এটি এনএসএট্রিবিউটেড স্ট্রিং ইমোতে বিভাগ হিসাবে আরও বোধ করে।
দিমিত্রিস

@ জাভিয়ের কেরল তাহলে লিঙ্ক ক্লিনিকগুলি কীভাবে পরিচালনা করবেন?
কারেনআনে

আপনি স্ট্রিংটি ডেটাতে NSUnicodeStringEncodingএনকোড করুন এবং তারপরে অক্ষরগুলিতে ডেটাটি আবার এনকোড করুন NSUTF8StringEncoding। ঠিক আছে?
তৈমুর বার্নিকোভিচ

1
দুঃখিত - এই সমাধানটি আমার পক্ষে কাজ করে না, ফন্টটি পছন্দসই ফন্টে সেট করা হয়নি। - self.font.fontName ব্যবহার করার পরিবর্তে এবং self.font.familyName ব্যবহারের পরিবর্তে কাঙ্ক্ষিত ফন্ট সেট করে তবে HTML ট্যাগগুলি সংরক্ষণ করা হয় না pre নীচে সমাধান দেখুন যা কাজ করে এবং কোনও প্রকারের এইচটিএমএল স্টাইল ব্যবহারের উপর নির্ভর করে না। -আরহ
রিচি হায়াত

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
সেরা এবং স্মার্ট উত্তর
তারিক

স্মার্ট উত্তর, সম্মত! চিয়ার্স
জিম টিয়ার্নি

হ্যালো, আসলে এটি দুর্দান্ত কাজ করে, তবে আমি যদি এই বৈশিষ্ট্যযুক্ত পাঠ্যটিকে এইচটিএমএল রূপান্তর করি তবে ফন্টের আকারটি এইচটিএমএল-তে বাড়ছে
মেহুল ঠাকর

1
প্রকৃতপক্ষে স্ট্যাকওভারফ্লো সম্পর্কিত অন্যান্য পোস্টের সহায়তা থেকে .. আমি অ্যাট্রিবিউটেড টেক্সটটি এইচটিএমএল এবং ফন্টের আকার ছাড়াও সূক্ষ্মভাবে কাজ করা সমস্ত কিছুতে রূপান্তর করতে সক্ষম হয়েছি, যা প্রায় দ্বিগুণ হয়ে যাচ্ছে
মেহুল ঠাক্কর

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
একটি আরও জেনেরিক পদ্ধতির নাম হ'ল গণনার সময় ফন্টের বৈশিষ্ট্যগুলি লক্ষ্য করা এবং একই বৈশিষ্ট্য সহ একটি ফন্ট তৈরি করা। আমি আমার কোডটি নীচে পোস্ট করব।
মার্কিভ

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

যদিও এটি খুব সংক্ষিপ্ত নয়, এটি আরও এইচটিএমএল দিয়ে এইচটিএমএল মোড়ানো নিয়ে সমস্যাটির আশেপাশে হ্যাকিংয়ের চেয়ে আরও স্থিতিশীল বলে মনে হয়।
সার্ভেক্স

23

হ্যাঁ, এর আরও সহজ সমাধান রয়েছে। এইচটিএমএল উত্সে ফন্ট সেট করুন!

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

UILabel এক্সটেনশনের সুইফট 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
    }
}

আইওএস 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))

আইওএস 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
      }
  }

এটি কাজ করার জন্য আপনার ইউলিকরের ওয়াইএলকালার.ইউইফটকে হেক্স রূপান্তর https://gist.github.com/yannickl/16f0ed38f0698d9a8ae7 প্রয়োজন


4

এনএসএইচটিএমএলটিেক্সট ডকুমেন্ট টাইপ ব্যবহার শৈলীগুলি নিয়ন্ত্রণ করা ধীর এবং শক্ত। আমি আপনাকে আমার লাইব্রেরি যা অ্যাট্রিবিউটিকা বলা হয় চেষ্টা করার পরামর্শ দিচ্ছি। এটির নিজস্ব খুব দ্রুত পার্সার রয়েছে। এছাড়াও আপনার যে কোনও ট্যাগের নাম থাকতে পারে এবং তাদের জন্য কোনও স্টাইল সংজ্ঞায়িত করতে পারেন।

উদাহরণ:

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

সবার উত্তর একসাথে যোগদান করে, আমি দুটি এক্সটেনশন করেছি যা এইচটিএমএল পাঠ্য সহ একটি লেবেল সেট করতে দেয়। উপরের কিছু উত্তর ফন্ট পরিবারকে বিশিষ্ট স্ট্রিংগুলিতে সঠিকভাবে ব্যাখ্যা করতে পারেনি। অন্যরা আমার প্রয়োজনের জন্য অসম্পূর্ণ ছিল বা অন্যভাবে ব্যর্থ হয়েছিল। আপনি আমাকে উন্নতি করতে চান এমন কিছু আছে কিনা তা আমাকে জানান।

আমি আশা করি এটা কারো সাহায্যে লাগবে.

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
পুরাতন স্কুলবাসীদের জন্য Thankশ্বরের ধন্যবাদ! :-)
জোসেফ রিসানেক

1

নীল ফন্ট সহ সুইফট 3 স্ট্রিং এক্সটেনশান। ফন্টবিহীন সম্পত্তিটি অন্য এসও প্রশ্ন থেকে নেওয়া হয়েছে, কোনটি মনে রাখবেন না :(

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

এনএসএসটিংয়ের জন্য এখানে একটি এক্সটেনশান রয়েছে যা অবজেক্টিভ-সি ব্যবহার করে কোনও এনএসএট্রিবিউটেড স্ট্রিং প্রদান করে।

এটি সঠিকভাবে এইচটিএমএল ট্যাগ সহ একটি স্ট্রিং পরিচালনা করে এবং বোল্ড, আইটালিকস সহ এইচটিএমএল ট্যাগ সংরক্ষণের সময় কাঙ্ক্ষিত ফন্ট এবং ফন্টের রঙ সেট করে ...

সর্বোপরি ফন্টের বৈশিষ্ট্যগুলি সেট করতে এটি কোনও এইচটিএমএল চিহ্নিতকারীগুলির উপর নির্ভর করে না।

@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

আসলে, একটি আরও সহজ এবং ক্লিনার উপায় বিদ্যমান। এইচটিএমএলকে বিশ্লেষণের পরে কেবল ফন্টটি সেট করুন:

 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> কারণ ফন্টের মাধ্যমে সেগুলি ওভাররাইট করা হয়েছে।
মিঃ জিস্টেম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.