Is it possible to get a listing of attributes and ranges for an NSMutableAttributedString? Is it possible to get a listing of attributes and ranges for an NSMutableAttributedString? ios ios

Is it possible to get a listing of attributes and ranges for an NSMutableAttributedString?


Swift 5 – 4

let attributedText = NSAttributedString(string: "Hello, playground", attributes: [  .foregroundColor: UIColor.red,   .backgroundColor: UIColor.green,   .ligature: 1,   .strikethroughStyle: 1])// retrieve attributeslet attributes = attributedText.attributes(at: 0, effectiveRange: nil)// iterate each attributefor attr in attributes {  print(attr.key, attr.value)}

In case, that you have defined attributedText of label.

Swift 3

var attributes = attributedText.attributes(  at: 0,   longestEffectiveRange: nil,   in: NSRange(location: 0, length: attributedText.length))

Swift 2.2

var attributes = attributedText.attributesAtIndex(0,     longestEffectiveRange: nil,   inRange: NSMakeRange(0, attributedText.length))


Apple expects you to use enumerateAttributesInRange:options:usingBlock:. The block you supply will receive ranges and the attributes applicable for that range.

I've used that in my code to create invisible buttons that are placed behind text so that it acts as a hyperlink.

You could also use enumerateAttribute:inRange:options:usingBlock: if there's only one you're interested in, but no halfway house is provided where you might be interested in, say, two attributes but not every attribute.


If you need all of the attributes from the string in the entire range, use this code:

NSDictionary *attributesFromString = [stringWithAttributes attributesAtIndex:0 longestEffectiveRange:nil inRange:NSMakeRange(0, stringWithAttributes.length)];