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

前端 未结 7 1318
小蘑菇
小蘑菇 2021-02-01 12:36

I\'ve created a method that takes a NSAttributedString and I\'m looking to dynamically create a subview and label to put the string into. Because attributes like font and size n

相关标签:
7条回答
  • 2021-02-01 12:59

    Swift 4:

    If you want to get the attributes for NSTextAttachment (just change the attribute value if you want font)

    commentTextView.attributedText.enumerateAttribute(NSAttachmentAttributeName,
                            in:NSMakeRange(0, commentTextView.attributedText.length),
                            options:.longestEffectiveRangeNotRequired) {
                            value, range, stop in
                                if let attachment = value as? NSTextAttachment {
                                    print("GOT AN ATTACHMENT! for comment at \(indexPath.row)")
                                }
    }
    
    0 讨论(0)
  • 2021-02-01 13:06

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

    0 讨论(0)
  • 2021-02-01 13:07

    Swift 5 – 4

    let attributedText = NSAttributedString(string: "Hello, playground", attributes: [
      .foregroundColor: UIColor.red, 
      .backgroundColor: UIColor.green, 
      .ligature: 1, 
      .strikethroughStyle: 1
    ])
    
    // retrieve attributes
    let attributes = attributedText.attributes(at: 0, effectiveRange: nil)
    
    // iterate each attribute
    for 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)
    )
    
    0 讨论(0)
  • 2021-02-01 13:13

    I have modified one of the answers with suggested fixes to prevent infinite recursion and application crashes.

    @IBDesignable
    extension UITextField{
    
        @IBInspectable var placeHolderColor: UIColor? {
            get {
                if let color = self.attributedPlaceholder?.attribute(.foregroundColor, at: 0, effectiveRange: nil) as? UIColor {
                    return color
                }
                return nil
            }
            set {
                self.attributedPlaceholder = NSAttributedString(string:self.placeholder != nil ? self.placeholder! : "", attributes:[.foregroundColor: newValue!])
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-01 13:14

    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.

    0 讨论(0)
  • 2021-02-01 13:20

    Apple's Docs have a number of methods to access attributes:

    To retrieve attribute values from either type of attributed string, use any of these methods:

    attributesAtIndex:effectiveRange: attributesAtIndex:longestEffectiveRange:inRange: attribute:atIndex:effectiveRange: attribute:atIndex:longestEffectiveRange:inRange: fontAttributesInRange: rulerAttributesInRange:

    0 讨论(0)
提交回复
热议问题