Search code examples
iosswiftnsattributedstring

NSFontAttributeName not applied to NSAttributedString


I'm currently using this extension provided by this answer to convert html to strings within a UITextView. Everything works perfectly but for some strange reason the NSFontAttributeName is not applied to the string during the process. Is there something I'm doing wrong here? (or should I apply the NSAttributedString after reeving the attributed html parsed string? If so, is it possible to apply an attribute to an NSAttributeString? ).

PS. Font size is not change when using html2String but the links within the html is are longer recognized by the UITextView

extension String {

    var html2AttributedString: NSAttributedString? {
        guard
            let data = dataUsingEncoding(NSUTF8StringEncoding)
            else { return nil }
        do {
            return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:NSUTF8StringEncoding, NSFontAttributeName : UIFont.systemFontOfSize(17.0)], documentAttributes: nil)
        } catch let error as NSError {
            print(error.localizedDescription)
            return  nil
        }
    }
    var html2String: String {
        return html2AttributedString?.string ?? ""
    }
}
cell.desc.attributedText  = apiData[currentIndex].description!.html2AttributedString //Font attribute not recognized
cell.desc.text  = apiData[currentIndex].description!.html2String //Font recognized by links no longer recognized

Solution

  • I'm not sure why (probably because of having a range) but it works if you first create an NSMutableAttributedString and then you add the UIFont attributes:

    extension String {
    
        var html2AttributedString: NSMutableAttributedString? {
            guard
                let data = dataUsingEncoding(NSUTF8StringEncoding)
                else { return nil }
            do {
                let attrStr = try NSMutableAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:NSUTF8StringEncoding], documentAttributes: nil)
                attrStr.addAttributes([NSFontAttributeName: UIFont.systemFontOfSize(17.0)], range: NSRange(location: 0, length: attrStr.length))
                return attrStr
            } catch let error as NSError {
                print(error.localizedDescription)
                return  nil
            }
        }
        var html2String: String {
            return html2AttributedString?.string ?? ""
        }
    }