Domanda

Ho creato un metodo che prende una stringa di NSATTRIBUTED e sto cercando di creare dinamicamente una sottoview ed etichetta per inserire la stringa. Poiché gli attributi come il carattere e la dimensione devono essere determinati per determinare correttamente le dimensioni dell'etichetta, devo determinare se è possibile iterare attraverso valori e intervalli che sono stati applicati alla stringa attribuita?

Capisco che potrei passare gli attributi separatamente, ma per motivi di riusabilità, mi piacerebbe poter passare il minor numero possibile di parametri al metodo.

È stato utile?

Soluzione 2

Apple si aspetta che tu usi enumerateAttributesInRange:options:usingBlock:. Il blocco fornito riceverà intervalli e gli attributi applicabili per tale intervallo.

L'ho usato nel mio codice per creare pulsanti invisibili posizionati dietro il testo in modo che funga da collegamento ipertestuale.

Potresti anche usare enumerateAttribute:inRange:options:usingBlock: Se ce n'è solo uno che ti interessa, ma non viene fornita alcuna casa a metà strada in cui potresti essere interessato, diciamo, due attributi ma non tutti gli attributi.

Altri suggerimenti

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

Nel caso in cui tu abbia definito attributedText di etichetta.

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

Se hai bisogno di tutti gli attributi dalla stringa nell'intero intervallo, utilizzare questo codice:

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:

Se si desidera ottenere gli attributi per NStextattachment (basta modificare il valore dell'attributo se si desidera il carattere)

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

I documenti di Apple Avere una serie di metodi per accedere agli attributi:

Per recuperare i valori degli attributi da entrambi i tipi di stringa attribuita, utilizzare uno di questi metodi:

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

Ho modificato una delle risposte con correzioni suggerite per prevenire l'infinito ricorsione e arresti di applicazione.

@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!])
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top