การแยกวิเคราะห์ HTML เป็น NSAttributedText - จะตั้งค่าแบบอักษรได้อย่างไร?


133

ฉันกำลังพยายามรับตัวอย่างข้อความที่จัดรูปแบบเป็น html เพื่อแสดงบน iPhone ใน UITableViewCell

จนถึงตอนนี้ฉันมีสิ่งนี้:

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];

ผลงานแบบนี้ ฉันได้รับข้อความบางส่วนที่มี 'Nice' เป็นตัวหนา! แต่ ... มันยังกำหนดฟอนต์ให้เป็น Times Roman ด้วย! นี่ไม่ใช่แบบอักษรที่ฉันต้องการ ฉันคิดว่าต้องตั้งค่าบางอย่างใน documentAttributes แต่ไม่พบตัวอย่างใด ๆ


1
หมายเหตุ: NSHTMLTextDocumentType อาจทำงานช้า ดูstackoverflow.com/questions/21166752/…
finneycanhelp

สำคัญ: หากคุณใช้แบบอักษรที่กำหนดเองคุณต้องดูคำตอบนี้stackoverflow.com/a/60786178/1223897
Yuvrajsinh

คำตอบ:


118

เวอร์ชันSwift 2ขึ้นอยู่กับคำตอบที่กำหนดโดยJavier Querol

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

Swift 3.0 และ iOS 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
    }
}

Swift 5 และ iOS 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
ไม่เปลี่ยนแบบอักษรปัจจุบันนี่คือสิ่งที่ฉันกำลังมองหาขอบคุณ!
Mohammad Zaid Pathan

2
นี้ได้ผล คุณสามารถตั้งค่าสตริงที่แก้ไขเป็น String ได้ทันทีและเว้นการเริ่มต้น NSString เช่น "<span style = \" font-family: (self.font! .fontName); font-size: (self.font! .pointSize) \ "> (text) </span>"
Matthew Korporaal

2
เพื่อให้ได้ผลงานนี้ (ซึ่งใช้งานได้ดีจริงๆ) ฉันต้องใส่เครื่องหมายคำพูดเดี่ยวรอบ ๆ ค่าแบบอักษร - ครอบครัวดังนั้น <div style = \ "font-family: '(self.font! .fontName)'; ....
geraldcor

4
ฉันคิดว่าตั้งแต่ iOS9 ควรใช้font-family: '-apple-system', 'HelveticaNeue';(ซึ่งใช้งานได้และเข้ากันได้กับรุ่นหลังด้วย) หากคุณรองรับเฉพาะ iOS9 font-family: -apple-system;สามารถใช้ได้
Daniel

1
color: #000000นอกจากนี้ยังมีประโยชน์คือความสามารถในการตั้งค่าสีของตัวอักษรเพียงแค่เพิ่มสีให้กับแอตทริบิวต์รูปแบบที่มีค่าในรูปแบบสตริงฐานสิบหก ดูลิงค์นี้สำหรับการแปลง UIColor เป็นสตริง hex: 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
สวยสง่ามาก!
Merlevede

2
ดี แม้ว่าจะเหมาะสมกว่าในฐานะหมวดหมู่ใน NSAttributedString imo
Dimitris

@Javier Querol แล้วจะจัดการ link clinks ได้อย่างไร?
KarenAnne

คุณเข้ารหัสสตริงข้อมูลด้วยแล้วข้อมูลที่เข้ารหัสกลับไปกับตัวละครNSUnicodeStringEncoding NSUTF8StringEncodingตกลงหรือเปล่า
Timur Bernikovich

1
ขอโทษ - วิธีนี้ใช้ไม่ได้สำหรับฉันแบบอักษรไม่ได้ตั้งค่าเป็นแบบอักษรที่ต้องการ - แทนที่จะใช้ self.font.fontName และใช้ self.font.familyName แทนตั้งค่าแบบอักษรที่ต้องการ แต่แท็ก HTML จะไม่ถูกเก็บรักษาไว้ ดูวิธีแก้ปัญหาด้านล่างที่ใช้งานได้และไม่ต้องพึ่งพาการใช้สไตล์ HTML ใด ๆ -rrh
Richie Hyatt

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"]];

เวอร์ชัน Swift:

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

4
วิธีแก้ปัญหาที่ง่ายที่สุด .. คำตอบอื่น ๆ อาจถูกต้อง แต่การทำสิ่งที่ยากกว่านั้นไม่ฉลาด .. :)
Sameera Chathuranga

2
คำตอบที่ดีที่สุดและชาญฉลาด
Tariq

คำตอบที่ฉลาดที่สุดเห็นด้วย! Cheers
Jim Tierney

สวัสดีจริงๆแล้วมันใช้งานได้ดี แต่ถ้าฉันแปลงข้อความที่มาจากแหล่งนี้กลับเป็น html ขนาดตัวอักษรจะเพิ่มขึ้นใน html นั้น
Mehul Thakkar

1
จริงๆแล้วจากความช่วยเหลือจากโพสต์อื่น ๆ ที่ล้นออกมา .. ฉันสามารถแปลงข้อความที่กำหนดเป็น html และทุกอย่างทำงานได้ดีนอกเหนือจากขนาดตัวอักษรซึ่งเพิ่มขึ้นเกือบสองเท่า
Mehul Thakkar

41

คิดออก หมีเล็กน้อยและอาจไม่ใช่คำตอบที่ดีที่สุด

รหัสนี้จะดำเนินการเปลี่ยนแปลงแบบอักษรทั้งหมด ฉันทราบว่ามีการใช้ "Times New Roman" และ "Times New Roman BoldMT" สำหรับแบบอักษร แต่อย่างไรก็ตามสิ่งนี้จะพบฟอนต์ตัวหนาและให้ฉันรีเซ็ต ฉันยังสามารถรีเซ็ตขนาดได้ในขณะที่ฉันอยู่

ฉันหวังเป็นอย่างยิ่งว่า / คิดว่ามีวิธีตั้งค่านี้ในเวลาแยกวิเคราะห์ แต่ฉันหาไม่พบหากมี

    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
การมองหาคำว่า "BOLD" ในชื่อแบบอักษรนั้นเป็นสิ่งที่น่ากลัว! นอกจากนี้ยังแบ่งแอตทริบิวต์แบบอักษรอื่น ๆ เช่นตัวเอียง
HughHughTeotl

1
วิธีการทั่วไปมากขึ้นคือการดูลักษณะแบบอักษรในขณะที่แจกแจงและสร้างแบบอักษรที่มีลักษณะเดียวกัน ฉันจะโพสต์รหัสของฉันด้านล่าง
markiv

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

อัปเดตSwift 4+ของส่วนขยายUILabel

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+


ค้นทุกที่มานี้ ... !! ขอบคุณ .. !
Irshad Qureshi

5

การปรับปรุงโซลูชันของ Victor รวมถึงสี:

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 ช้าและควบคุมสไตล์ได้ยาก ฉันขอแนะนำให้คุณลองใช้ห้องสมุดของฉันที่ชื่อว่า Atributika มีตัวแยกวิเคราะห์ที่รวดเร็วมากของตัวเอง นอกจากนี้คุณสามารถตั้งชื่อแท็กและกำหนดรูปแบบใดก็ได้

ตัวอย่าง:

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ขอบคุณ!
Radu Ursache

3

ขอบคุณสำหรับคำตอบฉันชอบส่วนขยายนี้มาก แต่ยังไม่ได้แปลงเป็น swift สำหรับนักเรียนเก่าที่ยังอยู่ใน Objective-C สิ่งนี้น่าจะช่วยได้เล็กน้อย: D

-(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];

}];    } 

Happy Coding! --Greg กรอบ


1
ขอบคุณพระเจ้าสำหรับเด็กนักเรียนเก่า! :-)
Josef Rysanek

1

ส่วนขยายSwift 3 String รวมถึงแบบอักษรศูนย์ คุณสมบัติที่ไม่มีแบบอักษรนำมาจากคำถาม 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 โดยใช้ Objective-C

จัดการสตริงที่มีแท็ก HTML อย่างถูกต้องและตั้งค่าแบบอักษรและสีแบบอักษรที่ต้องการในขณะที่รักษาแท็ก HTML รวมถึง BOLD, ITALICS ...

เหนือสิ่งอื่นใดคือไม่ต้องอาศัยเครื่องหมาย 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> เนื่องจากฟอนต์เหล่านี้เขียนทับ
Mr. Zystem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.