Diese Antwort wurde für Swift 4.2 aktualisiert.
Kurzübersicht
Die allgemeine Form zum Erstellen und Festlegen einer zugewiesenen Zeichenfolge lautet wie folgt. Weitere gängige Optionen finden Sie unten.
// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute)
// set attributed text on a UILabel
myLabel.attributedText = myAttrString
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myAttribute = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ]
let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray
let myAttribute = [ NSAttributedString.Key.shadow: myShadow ]
Der Rest dieses Beitrags enthält weitere Details für Interessierte.
Attribute
Zeichenfolgenattribute sind nur ein Wörterbuch in Form von [NSAttributedString.Key: Any]
, wobei NSAttributedString.Key
der Schlüsselname des Attributs und Any
der Wert eines Typs ist. Der Wert kann eine Schriftart, eine Farbe, eine Ganzzahl oder etwas anderes sein. Es gibt viele Standardattribute in Swift, die bereits vordefiniert wurden. Zum Beispiel:
- Schlüsselname :
NSAttributedString.Key.font
, Wert: aUIFont
- Schlüsselname :
NSAttributedString.Key.foregroundColor
, Wert: aUIColor
- Schlüsselname :
NSAttributedString.Key.link
, Wert: ein NSURL
oderNSString
Es gibt viele andere. Siehe diesen Link für mehr. Sie können sogar Ihre eigenen benutzerdefinierten Attribute erstellen wie:
Schlüsselname : NSAttributedString.Key.myName
, Wert: einige Typ.
Wenn Sie eine Erweiterung vornehmen :
extension NSAttributedString.Key {
static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
}
Attribute in Swift erstellen
Sie können Attribute wie jedes andere Wörterbuch deklarieren.
// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// multiple attributes declared at once
let multipleAttributes: [NSAttributedString.Key : Any] = [
NSAttributedString.Key.foregroundColor: UIColor.green,
NSAttributedString.Key.backgroundColor: UIColor.yellow,
NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// custom attribute
let customAttribute = [ NSAttributedString.Key.myName: "Some value" ]
Beachten Sie das rawValue
, was für den Unterstreichungsstilwert benötigt wurde.
Da Attribute nur Wörterbücher sind, können Sie sie auch erstellen, indem Sie ein leeres Wörterbuch erstellen und dann Schlüssel-Wert-Paare hinzufügen. Wenn der Wert mehrere Typen enthält, müssen Sie ihn Any
als Typ verwenden. Hier ist das multipleAttributes
Beispiel von oben, das auf diese Weise neu erstellt wurde:
var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue
Zugeschriebene Zeichenfolgen
Nachdem Sie die Attribute verstanden haben, können Sie zugeordnete Zeichenfolgen erstellen.
Initialisierung
Es gibt verschiedene Möglichkeiten, zugeordnete Zeichenfolgen zu erstellen. Wenn Sie nur eine schreibgeschützte Zeichenfolge benötigen, können Sie diese verwenden NSAttributedString
. Hier sind einige Möglichkeiten, um es zu initialisieren:
// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)
Wenn Sie die Attribute oder den Zeichenfolgeninhalt später ändern müssen, sollten Sie verwenden NSMutableAttributedString
. Die Erklärungen sind sehr ähnlich:
// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()
// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)
Ändern einer zugeordneten Zeichenfolge
Als Beispiel erstellen wir die zugewiesene Zeichenfolge oben in diesem Beitrag.
Erstellen Sie zunächst ein NSMutableAttributedString
mit einem neuen Schriftattribut.
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )
Wenn Sie mitarbeiten, setzen Sie die zugewiesene Zeichenfolge wie folgt auf UITextView
(oder UILabel
):
textView.attributedText = myString
Sie nicht verwenden textView.text
.
Hier ist das Ergebnis:
Fügen Sie dann eine weitere zugeordnete Zeichenfolge hinzu, für die keine Attribute festgelegt sind. (Beachten Sie, dass ich es let
, obwohl ich es myString
oben deklariert habe , trotzdem ändern kann, weil es ein ist NSMutableAttributedString
. Dies scheint mir ziemlich unkompliziert zu sein, und ich wäre nicht überrascht, wenn sich dies in Zukunft ändert. Hinterlassen Sie mir in diesem Fall einen Kommentar.)
let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)
Als nächstes wählen wir einfach das Wort "Strings" aus, das am Index beginnt 17
und eine Länge von hat 7
. Beachten Sie, dass dies ein NSRange
und kein Swift ist Range
. (Weitere Informationen zu Bereichen finden Sie in dieser Antwort .) Mit dieser addAttribute
Methode können wir den Attributschlüsselnamen an die erste Stelle, den Attributwert an die zweite Stelle und den Bereich an die dritte Stelle setzen.
var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)
Zuletzt fügen wir eine Hintergrundfarbe hinzu. Verwenden Sie für Abwechslung die addAttributes
Methode (beachten Sie die s
). Ich könnte mit dieser Methode mehrere Attribute gleichzeitig hinzufügen, aber ich werde nur noch eines hinzufügen.
myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)
Beachten Sie, dass sich die Attribute an einigen Stellen überlappen. Durch das Hinzufügen eines Attributs wird ein bereits vorhandenes Attribut nicht überschrieben.
verbunden
Weiterführende Literatur
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue