Attributed Text ist ein Mechanismus des iOS SDK, dargestellt durch die Klassen NSAttributedString und NSMutableAttributedString, der es ermöglicht, mehrere Stile auf verschiedene Teile einer einzelnen Textzeichenfolge anzuwenden. Im Gegensatz zu einem gewöhnlichen NSString speichert Attributed String nicht nur Zeichen, sondern auch ein Attributwörterbuch für jeden Bereich: Schriftart, Farbe, Zeilenabstand, Schatten und Ausrichtung. Laut der Apple Developer Documentation ist Attributed String die Grundlage für die Anzeige von formatiertem Text in UILabel, UITextView und UITextField. Es ist die Standardmethode, um Text ohne WebKit oder Drittanbieter-Bibliotheken zu stylen.
Wichtige Punkte
NSAttributedString ist eine Klasse des Foundation-Frameworks, die eine Zeichenfolge mit einem Satz benannter Attribute darstellt, die an Zeichenbereiche gebunden sind. Jedes Attribut ist ein Schlüssel-Wert-Paar: Der Schlüssel ist durch eine Konstante definiert (NSFontAttributeName, NSForegroundColorAttributeName), und der Wert ist das entsprechende Objekt (UIFont, UIColor). Attribute werden über NSRange auf einen Zeichenbereich angewendet.
Die Klasse ist auf allen Apple-Plattformen verfügbar: iOS (2.0+), macOS, tvOS, watchOS. NSAttributedString ist unveränderlich — einmal erstellt, sind seine Attribute festgelegt. Für dynamische Änderungen wird NSMutableAttributedString verwendet, der von NSAttributedString erbt und die Methoden setAttributes, addAttributes, addAttribute, removeAttribute hinzufügt.
NSString ist eine einfache Zeichenfolge ohne Stilinformationen. Jeder Text, der über text an UILabel übergeben wird, wird mit einer einzigen Schriftart, Farbe und Größe angezeigt. NSAttributedString, der über attributedText übergeben wird, ermöglicht es jedem Zeichen, seinen eigenen Satz von Attributen zu haben. UILabel, UITextView und UITextField erkennen NSAttributedString automatisch und rendern den Text entsprechend seinen Attributen.
Intern speichert NSAttributedString einen NSString mit dem Text und ein Array von Attributbereichen. Jeder Bereich wird durch eine NSRange-Struktur und ein Attributwörterbuch dargestellt. Beim Rendern durchläuft das System die Bereiche und wendet die entsprechenden Attribute auf jeden Abschnitt an. Die Effizienz hängt von der Anzahl der Attributwechsel ab — häufige Änderungen in kurzen Abschnitten erhöhen die Renderzeit.
NSAttributedString-Attribute sind Konstanten, die in UIKit (iOS) und AppKit (macOS) definiert sind, jede entspricht einem bestimmten Aspekt der visuellen Textgestaltung. Alle Attribute sind NSAttributedString.Key-Zeichenfolgen, und ihre Werte sind Objekte bestimmter Klassen. Attribute werden in Zeichenebene (betrifft Zeichen) und Absatzebene (betrifft Absätze) unterteilt.
Attribute auf Zeichenebene umfassen Schriftart (NSFontAttributeName), Textfarbe (NSForegroundColorAttributeName), Hintergrundfarbe (NSBackgroundColorAttributeName), Unterstreichung (NSUnderlineStyleAttributeName), Durchstreichung (NSStrikethroughStyleAttributeName), Schatten (NSShadowAttributeName). Attribute auf Absatzebene werden über NSParagraphStyleAttributeName festgelegt, der Ausrichtung, Einzug, Zeilenabstand und Tabulierung steuert.
NSLinkAttributeName erstellt einen klickbaren Link im Text: Der Wert ist eine URL oder Zeichenfolge. UITextView behandelt solche Links automatisch, wenn die Interaktion aktiviert ist. NSAttachmentAttributeName ermöglicht das Einbetten eines NSTextAttachment — ein Bild innerhalb des Textes, das als Inline-Element gerendert wird. Dies wird verwendet, um Text mit Symbolen, Emojis oder benutzerdefinierten Ansichten innerhalb einer Zeichenfolge zu erstellen.
Jedes NSAttributedString-Attribut hat einen streng typisierten Wert. Betrachten wir die am häufigsten verwendeten Attribute in der iOS-Entwicklung. Die Schriftart wird über ein UIFont-Objekt festgelegt, die Farbe über UIColor, der Zeilenabstand über NSMutableParagraphStyle, der Ausrichtung, Einzug und Abstände in einem einzigen Objekt konfigurieren kann.
| Attributschlüssel | Werttyp | Zweck |
|---|---|---|
| NSFontAttributeName | UIFont | Textschriftart |
| NSForegroundColorAttributeName | UIColor | Textfarbe |
| NSBackgroundColorAttributeName | UIColor | Hintergrundfarbe hinter dem Text |
| NSUnderlineStyleAttributeName | NSNumber (Int) | Unterstreichungsstil |
| NSParagraphStyleAttributeName | NSParagraphStyle | Absatzeinstellungen |
| NSKernAttributeName | NSNumber (Float) | Zeichenabstand (Kerning) |
NSParagraphStyle ist ein Container für Absatzattribute: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight und andere. Um diese Parameter zu ändern, wird ein NSMutableParagraphStyle erstellt, die gewünschten Eigenschaften werden festgelegt, und das Objekt wird als Wert des NSParagraphStyleAttributeName-Attributs übergeben. Dies ist die einzige Möglichkeit, den Zeilenabstand in NSAttributedString zu steuern.
NSShadow ermöglicht das Hinzufügen eines Schattens zum Text: Die Parameter shadowOffset, shadowBlurRadius, shadowColor legen Versatz, Unschärfe und Farbe des Schattens fest. Unterstreichungs- und Durchstreichungsattribute akzeptieren Stilkombinationen: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. Für die präzise Steuerung von Liniendicke und -farbe werden NSUnderlineColorAttributeName und NSStrikethroughColorAttributeName verwendet.
Die Erstellung eines NSAttributedString in Swift erfolgt über einen Initialisierer mit dem Text und einem Attributwörterbuch oder über NSMutableAttributedString mit schrittweiser Stilanwendung. Der grundlegende Ansatz besteht darin, ein Attributwörterbuch für den gesamten Text zu definieren und dann Attribute für bestimmte Bereiche hinzuzufügen oder zu ändern.
Ein einfaches Beispiel — Schriftart, Farbe und Ausrichtung für die gesamte Zeichenfolge festlegen. Das Attributwörterbuch wird an den NSAttributedString-Initialisierer übergeben. Die Wörterbuchschlüssel sind NSAttributedString.Key-Konstanten, die Werte sind entsprechende UIKit-Objekte. Dies ist der Basisfall, wenn der gesamte Text einheitlich formatiert wird.
let attributes: [NSAttributedString.Key: Any] = [
.font: UIFont.systemFont(ofSize: 16),
.foregroundColor: UIColor.darkGray,
.paragraphStyle: let style = NSMutableParagraphStyle()
style.alignment = .center
style.lineSpacing = 4
return style
]
let attributedString = NSAttributedString(
string: "Hello world",
attributes: attributes
)
label.attributedText = attributedString
Der Text wird mit systemFont 16, dunkelgrauer Farbe, zentrierter Ausrichtung und 4pt Zeilenabstand angezeigt. Dieser Ansatz ist praktisch für statische Überschriften und Schaltflächen.
NSMutableAttributedString ermöglicht die Anwendung verschiedener Stile auf verschiedene Teile des Textes. Die Methode addAttribute fügt ein einzelnes Attribut zu einem Bereich hinzu, addAttributes fügt ein Attributwörterbuch hinzu. Die Methode setAttributes ersetzt alle vorhandenen Attribute eines Bereichs durch neue. Dies ist das Hauptwerkzeug zum Erstellen von Text mit Hervorhebungen.
let text = "Price: 1999 rubles"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.foregroundColor,
value: UIColor.green, range: NSRange(location: 6, length: 4))
attributed.addAttribute(.font,
value: UIFont.boldSystemFont(ofSize: 20), range: NSRange(location: 6, length: 4))
label.attributedText = attributed
Das Wort „1999“ wird grün und fett sein, der restliche Text bleibt Standard. NSRange wird manuell berechnet — es ist wichtig, die Länge in Zeichen korrekt zu zählen, insbesondere bei der Arbeit mit Emojis und zusammengesetzten Unicode-Zeichen.
NSMutableAttributedString bietet Methoden zum dynamischen Ändern von Text und Attributen: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. Dies ermöglicht das Erstellen von Text aus verschiedenen Quellen, das Kombinieren von Stilen und das Reagieren auf Schnittstellenereignisse.
Im Gegensatz zum unveränderlichen NSAttributedString unterstützt die veränderliche Version das Ändern von Inhalten, ohne ein neues Objekt zu erstellen. Dies ist kritisch für Texteditoren, Chats und Formulare, in denen der Benutzer Text bearbeiten kann, während Stile erhalten bleiben müssen.
In Messengern enthält jede Nachricht den Benutzernamen (fett), den Nachrichtentext (normal), die Uhrzeit (graue Farbe). NSMutableAttributedString ermöglicht das Erstellen einer solchen Zeichenfolge auf einmal, indem Teile in der gewünschten Reihenfolge mit den entsprechenden Attributen hinzugefügt werden.
let result = NSMutableAttributedString()
let name = NSAttributedString(string: "Anna: ",
attributes: [.font: UIFont.boldSystemFont(ofSize: 15)])
let message = NSAttributedString(string: "Hello, how are you?",
attributes: [.font: UIFont.systemFont(ofSize: 15)])
let time = NSAttributedString(string: " 12:30",
attributes: [.foregroundColor: UIColor.gray])
result.append(name)
result.append(message)
result.append(time)
label.attributedText = result
Das Ergebnis ist eine einzelne Zeichenfolge mit drei gestylten Abschnitten. Append berechnet NSRange automatisch, Positionen müssen nicht manuell berechnet werden. Dieser Ansatz skaliert auf jede Anzahl von Fragmenten.
Die Methode enumerateAttributes(in:options:using:) durchläuft alle Attributbereiche im angegebenen Intervall. Dies ist nützlich für die Formatierungsanalyse: Alle Links finden, die Farbe bestimmter Attribute ändern oder Text nach HTML exportieren. Dem Closure werden das Attributwörterbuch und der NSRange des aktuellen Abschnitts übergeben.
Alle wichtigen UI-Komponenten zur Textanzeige in UIKit unterstützen NSAttributedString über die Eigenschaft attributedText. UILabel zeigt statischen gestylten Text an, UITextView unterstützt Bearbeitung und Links, UITextField akzeptiert Attribute für Platzhalter und eingegebenen Text getrennt.
UILabel ist die leichteste Komponente zur Anzeige von gestyltem Text. Es unterstützt alle Attribute auf Zeichenebene, verarbeitet jedoch keine klickbaren Links automatisch (dafür wird UITextView benötigt). UILabel ist ideal für Überschriften, Beschriftungen und kurze formatierte Texte.
UITextView verarbeitet NSLinkAttributeName und zeigt Links als interaktive Elemente an. Um diese Funktionalität zu aktivieren, setzen Sie isSelectable = true und isEditable = false. Beim Antippen eines Links erhält der Delegierte den Aufruf textView(_:shouldInteractWith:in:interaction:). UITextView unterstützt auch NSTextAttachment für Bilder innerhalb des Textes.
let text = "Details on developer.apple.com"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.link,
value: URL(string: "https://developer.apple.com")!,
range: NSRange(location: 0, length: text.count))
textView.attributedText = attributed
textView.isSelectable = true
textView.isEditable = false
Nach dem Setzen von isSelectable und isEditable verhält sich der Textbereich wie ein statischer Textblock, aber die Links bleiben aktiv. UITextViewDelegate steuert das Verhalten beim Antippen.
Core Text ist ein Low-Level-Framework von Apple zur Textdarstellung, das direkt mit NSAttributedString arbeitet. Im Gegensatz zu UIKit verwendet Core Text NSAttributedString nicht direkt als Anzeigeobjekt — stattdessen konvertiert es ihn in CTFramesetter, dann CTFrame und rendert in einem Core Graphics-Kontext. Dies gibt volle Kontrolle über das Zeilenlayout und die Glyphen.
Die Verwendung von Core Text ist gerechtfertigt für benutzerdefinierte Textlayouts: Spalten, Bildumlauf, Textdrehung, nicht standardmäßige Zeilenumbrüche. Der NSMutableParagraphStyle von Core Text enthält Attribute, die in UIKit nicht verfügbar sind: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode mit zusätzlichen Modi.
NSAttributedString wird nahtlos zwischen UIKit und Core Text übertragen, da beide Frameworks mit demselben Typ arbeiten. UIKit-Attribute (NSFontAttributeName, NSForegroundColorAttributeName) werden automatisch von Core Text erkannt und umgekehrt — Core Text-Attribute (kCTFontAttributeName) werden von UIKit gelesen. Dies ermöglicht die Verwendung von UIKit für einfache Aufgaben und Core Text für benutzerdefiniertes Rendern auf demselben NSAttributedString-Objekt.
Häufig gestellte Fragen
NSString speichert nur Text ohne Stilinformationen. NSAttributedString ergänzt Text mit einem Attributwörterbuch für jeden Zeichenbereich. Wenn über die text-Eigenschaft an UILabel übergeben, wird NSString als einfacher Text angezeigt. Wenn NSAttributedString über attributedText übergeben wird, werden alle Attribute angewendet: verschiedene Schriftarten, Farben und Abstände in einer einzigen Zeichenfolge.
Verwenden Sie die Methode addAttributes(_:range:) mit einem Attributwörterbuch: addAttributes([.font: font, .foregroundColor: color], range: range). Um ein einzelnes Attribut hinzuzufügen oder zu ändern, verwenden Sie addAttribute(_:value:range:). Die Methode setAttributes ersetzt alle vorhandenen Attribute im Bereich durch die übergebenen.
Erstellen Sie einen NSMutableParagraphStyle, setzen Sie die Eigenschaft lineSpacing, und übergeben Sie ihn dann als Wert des Attributs NSParagraphStyleAttributeName. Für vollständige Kontrolle sind auch minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode und alignment verfügbar. ParagraphStyle ist die einzige Möglichkeit, den Zeilenabstand zu steuern.
Ja, SwiftUI unterstützt NSAttributedString über Text(attributedString:) ab iOS 15+. In älteren Versionen verwenden Sie UIViewRepresentable mit UILabel oder UITextView. SwiftUI bietet auch seinen eigenen AttributedString-Typ (SwiftUI, nicht Foundation) für deklarative Formatierung mit Markdown-ähnlicher Syntax.
Verwenden Sie die Methode boundingRect(with:options:context:), die den CGRect zurückgibt, der zum Anzeigen der Zeichenfolge mit den gegebenen Attributen erforderlich ist. Der Parameter options: [.usesLineFragmentOrigin, .usesFontLeading] berücksichtigt Zeilenabstände und Schriftmetriken. Für UILabel mit einer begrenzten Anzahl von Zeilen verwenden Sie sizeThatFits.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch