Ist es möglich, eine Auflistung von Attributen und Bereichen für eine NSMutableAttributedString zu erhalten?

StackOverflow https://stackoverflow.com/questions/19844336

Frage

Ich habe eine Methode erstellt, die einen nsattribierten String annimmt, und ich möchte dynamisch eine Unteransicht und Beschriftung erstellen, um die Zeichenfolge einzulegen. Da Attribute wie Schriftart und Größe bestimmt werden müssen, um die Größe der Etikett korrekt zu bestimmen, muss ich feststellen, ob es möglich ist, durch Werte und Bereiche zu iterieren, die auf die zugeschriebene Zeichenfolge angewendet wurden?

Ich verstehe, dass ich die Attribute getrennt übergeben könnte, aber aus Gründen der Wiederverwendbarkeit möchte ich in der Lage sein, so wenige Parameter wie möglich an die Methode zu übergeben.

War es hilfreich?

Lösung 2

Apple erwartet, dass Sie verwenden enumerateAttributesInRange:options:usingBlock:. Der Block, den Sie zur Verfügung stellen, erhält Bereiche und die für diesen Bereich geltenden Attribute.

Ich habe das in meinem Code verwendet, um unsichtbare Schaltflächen zu erstellen, die hinter Text platziert sind, damit er als Hyperlink fungiert.

Sie könnten auch verwenden enumerateAttribute:inRange:options:usingBlock: Wenn es nur einen gibt, an dem Sie interessiert sind, aber kein Haus zur Hälfte ist, wo Sie beispielsweise zwei Attribute, aber nicht jedes Attribut interessiert sind.

Andere Tipps

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

Falls Sie definiert haben attributedText von Etikett.

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

Wenn Sie alle Attribute aus der Zeichenfolge im gesamten Bereich benötigen, verwenden Sie diesen Code:

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

Swift 3:

// in case, that you have defined `attributedText` of label
var attributes = attributedText.attributes(at: 0, longestEffectiveRange: nil, in: NSMakeRange(0, attributedText.length))
...

Swift 4:

Wenn Sie die Attribute für nStextAttachment erhalten möchten (ändern Sie einfach den Attributwert, wenn Sie eine Schriftart möchten).

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

Apples Dokumente Haben Sie eine Reihe von Methoden, um auf Attribute zuzugreifen:

Verwenden Sie eine dieser Methoden, um Attributwerte aus beiden Arten der zugeschriebenen Zeichenfolge abzurufen:

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

Ich habe eine der Antworten mit vorgeschlagenen Korrekturen geändert, um Unendlichkeitsrekursion und Anwendungsabstürzen zu verhindern.

@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!])
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top