NSAttributedString ist eine Klasse aus dem Foundation-Framework im iOS SDK, die einen String mit einer Reihe von Formatierungsattributen darstellt, die auf einzelne Zeichen oder Textbereiche angewendet werden. Im Gegensatz zu normalem NSString speichert NSAttributedString nicht nur Unicode-Zeichen, sondern auch ein Wörterbuch mit Attributen (Schriftart, Farbe, Kerning, Ausrichtung) für jedes Segment des Strings. Laut Apple Developer Documentation (2026) ist NSAttributedString die Grundlage für die Anzeige von formatiertem Text in allen iOS-UI-Komponenten.
Wichtige Punkte
NSAttributedString ist eine grundlegende iOS/macOS-Klasse für die Arbeit mit formatiertem Text. Sie erweitert NSString, indem sie dem String Attribute hinzufügt — ein Wörterbuch von Schlüssel-Wert-Paaren, bei dem der Schlüssel eine NSAttributedStringKey-Konstante (z. B. .font, .foregroundColor) und der Wert das entsprechende Objekt (UIFont, UIColor) ist. Jedes Zeichen im String kann seinen eigenen Satz von Attributen haben, was gemischte Formatierung innerhalb eines einzelnen Strings ermöglicht.
Die Architektur von NSAttributedString basiert auf dem Konzept der Attributläufe (attribute runs). Wenn Sie das .font-Attribut auf UIFont.boldSystemFont(ofSize: 16) für den Zeichenbereich 0..5 setzen, werden alle Zeichen dieses Bereichs fett dargestellt. Andere Zeichen können eine andere Schriftart oder gar kein Attribut haben. Beim Rendern eines attributierten Strings führt das UIKit-System die Merkmale aus verschiedenen Bereichen zusammen und rendert den Text einheitlich.
NSAttributedString ist unveränderlich — nach der Erstellung können seine Attribute und sein Inhalt nicht geändert werden. Für Änderungen gibt es die Unterklasse NSMutableAttributedString, die Methoden zum Hinzufügen, Entfernen und Ändern von Attributen in beliebigen Bereichen bietet. Diese Unterscheidung ist für die Multithreading wichtig: der unveränderliche NSAttributedString ist threadsicher, NSMutableAttributedString dagegen nicht.
NSAttributedString unterstützt etwa 40 Standardattribute, die in NSAttributedStringKey definiert sind. Jedes Attribut beeinflusst einen bestimmten Aspekt des Texterscheinungsbilds: Schriftart, Farbe, Position, Unterstreichung, Schatten, Kerning, Absatzstil und Hyperlinks. Zum Festlegen eines Attributs verwenden Sie eine NSAttributedStringKey-Konstante und weisen ihr ein Objekt des entsprechenden Typs zu.
| Attributschlüssel | Werttyp | Zweck |
|---|---|---|
| .font | UIFont | Schriftart und Textgröße |
| .foregroundColor | UIColor | Textfarbe |
| .backgroundColor | UIColor | Hintergrundfarbe hinter dem Text |
| .paragraphStyle | NSParagraphStyle | Ausrichtung, Zeilenabstand, Einzüge |
| .kern | NSNumber (Float) | Zeichenabstand (Kerning) |
| .underlineStyle | NSUnderlineStyle (Int) | Unterstreichungsstil (einfach, doppelt, dick, Muster) |
| .strikethroughStyle | NSUnderlineStyle (Int) | Durchstreichungsstil |
| .link | NSURL | URL für interaktiven Hyperlink |
| .shadow | NSShadow | Textschatten mit Offset, blurRadius und Farbe |
| .baselineOffset | NSNumber (Float) | Textversatz von der Grundlinie |
NSMutableParagraphStyle ist ein Objekt, das die visuellen Merkmale eines Absatzes verwaltet: Ausrichtung (.alignment: .left, .center, .right, .justified), Zeilenabstand (.lineSpacing), Absatzabstand (.paragraphSpacing), Einzug der ersten Zeile (.firstLineHeadIndent), linker und rechter Einzug (.headIndent, .tailIndent) und Textrichtung (.baseWritingDirection). ParagraphStyle wird auf einen Bereich angewendet, der Zeilenumbruchzeichen enthält, wenn die gleiche Formatierung für den gesamten Absatz erforderlich ist.
Die Erstellung eines NSAttributedString erfolgt über einen Initialisierer, der einen String und ein Attributwörterbuch entgegennimmt. Die Attribute werden auf den gesamten String angewendet. Für gemischte Formatierung (unterschiedliche Attribute in verschiedenen Teilen des Strings) wird NSMutableAttributedString mit anschließendem Hinzufügen von Attributen zu bestimmten Bereichen verwendet. Objective-C verwendet ein NSAttributedStringKey: UIFont-Wörterbuch, während Swift ein typsicheres [NSAttributedString.Key: Any]-Wörterbuch verwendet.
let plainText = "Hello, Swift!"
// Create with uniform attributes for the entire string
let attributes: [NSAttributedString.Key: Any] = [
NSAttributedString.Key.font:
UIFont.systemFont(ofSize: 18),
NSAttributedString.Key.foregroundColor:
UIColor.darkText,
NSAttributedString.Key.kern: 1.5
]
let attributedString =
NSAttributedString(string: plainText,
attributes: attributes)
Ein Beispiel demonstriert die Absatzformatierung über NSMutableParagraphStyle. Es werden zentrierte Ausrichtung, Zeilenabstand von 8 Punkten, Absatzabstand von 12 Punkten festgelegt. ParagraphStyle wird unter dem Schlüssel .paragraphStyle zum Attributwörterbuch hinzugefügt. NSAttributedString kopiert das übergebene paragraphStyle, sodass Sie es nach der Erstellung des Strings ändern können, ohne den bereits erstellten String zu beeinflussen.
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = NSTextAlignment.center
paragraphStyle.lineSpacing = 8.0
paragraphStyle.paragraphSpacing = 12.0
paragraphStyle.firstLineHeadIndent = 20.0
let attributed = NSAttributedString(
string: "Centered paragraph with spacing",
attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle])
NSMutableAttributedString ist eine Unterklasse von NSAttributedString, die das Ändern von Inhalt und Attributen nach der Erstellung ermöglicht. Hauptmethoden: addAttribute(_:value:range:) zum Hinzufügen eines einzelnen Attributs zu einem Bereich; addAttributes(_:range:) zum Hinzufügen mehrerer Attribute; setAttributes(_:range:) zum Ersetzen aller Attribute in einem Bereich; removeAttribute(_:range:) zum Entfernen eines Attributs; replaceCharacters(in:with:) zum Ersetzen von Text.
addAttribute und addAttributes fügen Attribute zu vorhandenen hinzu, ohne bereits gesetzte Attribute zu entfernen. Wenn ein Bereich bereits ein Attribut mit demselben Schlüssel hat, wird dessen Wert ersetzt. setAttributes ersetzt das Attributwörterbuch für einen Bereich vollständig — alle zuvor gesetzten Attribute werden entfernt. Dies ist wichtig zu verstehen, wenn man einen einzelnen String sequenziell formatiert: addAttributes ist sicherer, da es bereits gesetzte Schriftarten und Farben nicht zurücksetzt.
Bereiche (NSRange) werden mit der Struktur NSRange(location: 0, length: 5) angegeben. location ist der Startindex (0-basiert), length ist die Anzahl der Zeichen. Wenn der Bereich die Stringgrenzen überschreitet, löst NSMutableAttributedString eine NSRangeException aus. Für sichere Bereichsoperationen verwenden Sie NSRange-Methoden aus Foundation wie NSIntersectionRange und NSUnionRange.
let attributed = NSMutableAttributedString(
string: "Bold and red text here")
// Apply bold font to first 9 characters
let boldRange = NSRange(location: 0, length: 9)
attributed.addAttribute(
NSAttributedString.Key.font,
value: UIFont.boldSystemFont(ofSize: 16),
range: boldRange)
// Apply red color to characters 13-16 ("text")
let redRange = NSRange(location: 13, length: 4)
attributed.addAttribute(
NSAttributedString.Key.foregroundColor,
value: UIColor.red,
range: redRange)
// Apply underline to the entire string
let fullRange = NSRange(location: 0,
length: attributed.length)
attributed.addAttribute(
NSAttributedString.Key.underlineStyle,
value: NSUnderlineStyle.single.rawValue,
range: fullRange)
Die häufigste Methode zur Anzeige eines NSAttributedString ist die Zuweisung an die attributedText-Eigenschaft eines UILabel. Im Gegensatz zur text-Eigenschaft verwendet attributedText Attribute für das Rendering und unterstützt gemischte Formatierung. Wichtig: Wenn attributedText gesetzt ist, ignoriert UILabel die Eigenschaften font, textColor und textAlignment — alle visuellen Merkmale stammen aus den NSAttributedString-Attributen.
let label = UILabel()
label.numberOfLines = 0
let fullText = NSMutableAttributedString(
string: "Price: $24.99 per month")
// Format "Price:" label with bold font
let priceLabelRange = NSRange(
location: 0, length: 6)
fullText.addAttribute(
NSAttributedString.Key.font,
value: UIFont.boldSystemFont(ofSize: 16),
range: priceLabelRange)
// Format "$24.99" with green color
let amountRange = NSRange(
location: 7, length: 6)
fullText.addAttribute(
NSAttributedString.Key.foregroundColor,
value: UIColor.systemGreen(),
range: amountRange)
fullText.addAttribute(
NSAttributedString.Key.font,
value: UIFont.boldSystemFont(ofSize: 22),
range: amountRange)
// Apply gray color to "per month" text
let periodRange = NSRange(
location: 14, length: 9)
fullText.addAttribute(
NSAttributedString.Key.foregroundColor,
value: UIColor.secondaryLabel,
range: periodRange)
label.attributedText = fullText
UITextView unterstützt interaktive Links in NSAttributedString. Das .link-Attribut mit einer NSURL macht Text anklickbar. Zur Behandlung von Taps verwenden Sie den UITextViewDelegate mit der Methode textView(_:shouldInteractWith:in:interaction:). UITextView unterstützt auch Textauswahl und die Verwendung von UIMenuController für Standardoperationen (Kopieren, Suchen).
NSAttributedString unterstützt die Konvertierung aus HTML und RTF über NSAttributedString.DocumentType. Zum Laden von HTML verwenden Sie den Initialisierer mit dem Parameter documentAttributes: NSAttributedString(data: htmlData, options: [.documentType: .html], documentAttributes: nil). Ähnlich für RTF: .rtf oder .rtfd. Dieser Mechanismus ist nützlich, um HTML-Inhalte ohne WebView anzuzeigen.
Für den Export nach HTML verwenden Sie die Methode data(from:documentAttributes:) mit einem Bereich und Dokumenttyp. HTML-Export: try attributedString.data(from: fullRange, documentAttributes: [.documentType: .html]). Die resultierenden Daten können in einer Datei gespeichert, an einen Server gesendet oder in einem WebView angezeigt werden. Beim Export werden Schriftarten, Farben, Ausrichtung, Listen — alle Formatierungsattribute — in CSS-Stile konvertiert.
Die RTF-Unterstützung ist besonders relevant für macOS-Anwendungen, wo RTF das Standardformat für Rich Text ist. iOS unterstützt ebenfalls das Lesen und Schreiben von RTF, verwendet es jedoch nicht als primäres Format. Der Unterschied zwischen RTF und RTFD: RTFD enthält eingebettete Ressourcen (Bilder), die in einem Verzeichnis verpackt sind. NSAttributedString kann beide Formate über eine einzige Schnittstelle verarbeiten.
let htmlString = "<p><b>Bold<\/b> and <i>italic<\/i><\/p>"
guard let htmlData = htmlString.data(
using: String.Encoding.utf8) else { return }
let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
NSAttributedString.DocumentReadingOptionKey.documentType:
NSAttributedString.DocumentType.html
]
let attributedFromHTML =
try? NSAttributedString(
data: htmlData,
options: options,
documentAttributes: nil)
Häufig gestellte Fragen
NSString speichert nur eine Sequenz von Unicode-Zeichen ohne Formatierungsinformationen. NSAttributedString speichert Zeichen und enthält für jeden Teilbereich ein Wörterbuch mit Attributen (Schriftart, Farbe, Stil). Bei der Anzeige verwendet UIKit diese Attribute zum Rendering und erzeugt formatierten Text.
Der häufigste Grund ist die Verwendung der text-Eigenschaft anstelle von attributedText. Bei der Zuweisung über text werden alle Attribute ignoriert. Der zweite Grund: Nach dem Setzen von attributedText ändern Sie font, textColor oder textAlignment des UILabel — diese Änderungen setzen attributedText zurück. Verwenden Sie nur attributedText für formatierten Text.
Erstellen Sie einen NSMutableAttributedString und rufen Sie addAttribute(.font, value: boldFont, range: boldRange) für jedes Segment mit einer anderen Schriftart auf. Jeder Aufruf wendet das Attribut nur auf den angegebenen Bereich an. Die verbleibenden Zeichen behalten die Standardschriftart oder eine zuvor festgelegte bei. So entstehen Attributläufe mit verschiedenen Schriftarten.
Ja, NSAttributedString verarbeitet mehrzeiligen Text korrekt, einschließlich Zeilenumbruchzeichen ( ). UITextView und UILabel (mit numberOfLines = 0) brechen Text automatisch in eine neue Zeile um. NSMutableParagraphStyle verwaltet Zeilenabstand, Einzüge und Ausrichtung für jeden Absatz unabhängig.
Verwenden Sie NSMutableAttributedString mit dem .foregroundColor-Attribut für jeden Farbbereich. Für roten Text: addAttribute(.foregroundColor, value: UIColor.red, range: firstRange). Für blauen: addAttribute(.foregroundColor, value: UIColor.blue, range: secondRange). Die Farben werden nur auf die angegebenen Zeichenbereiche angewendet.
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