NSAttributedString — is een klasse uit het Foundation framework in iOS SDK die een string voorstelt met een set opmaakattributen die worden toegepast op individuele tekens of tekstbereiken. In tegenstelling tot gewone NSString, slaat NSAttributedString niet alleen Unicode-tekens op, maar ook een woordenboek van attributen (lettertype, kleur, spatiëring tussen tekens, uitlijning) voor elk segment van de string. Volgens Apple Developer Documentation (2026) vormt NSAttributedString de basis voor het weergeven van opgemaakte tekst in alle UI-componenten van iOS.
Belangrijkste punten
NSAttributedString — is een fundamentele klasse in iOS/macOS voor het werken met opgemaakte tekst. Het breidt de mogelijkheden van NSString uit door attributen aan de string toe te voegen — een woordenboek van sleutel-waardeparen, waarbij de sleutel een NSAttributedStringKey-constante is (bijv. .font, .foregroundColor) en de waarde het bijbehorende object (UIFont, UIColor). Elk teken in de string kan zijn eigen set attributen hebben, waardoor gemengde opmaak in één string mogelijk is.
De architectuur van NSAttributedString is gebaseerd op het concept van attribuutbereiken (attribute runs). Als u het attribuut .font = UIFont.boldSystemFont(ofSize: 16) instelt voor het tekenbereik 0..5, worden alle tekens in dit bereik weergegeven in een vet lettertype. De overige tekens kunnen een ander lettertype hebben of helemaal geen attribuut. Bij het weergeven van een geattribueerde string combineert het UIKit-systeem kenmerken uit verschillende bereiken en rendert de tekst uniform.
NSAttributedString is onveranderlijk — na creatie kunnen de attributen en inhoud niet worden gewijzigd. Voor wijzigingen bestaat de subklasse NSMutableAttributedString, die methoden biedt voor het toevoegen, verwijderen en wijzigen van attributen in elk bereik. Dit verschil is belangrijk voor multi-threading: onveranderlijke NSAttributedString is thread-safe, maar NSMutableAttributedString niet.
NSAttributedString ondersteunt ongeveer 40 standaardattributen gedefinieerd in NSAttributedStringKey. Elk attribuut beïnvloedt een specifiek aspect van het uiterlijk van de tekst: lettertype, kleur, positie, onderstreping, schaduw, spatiëring tussen tekens, alineastijl en hyperlinks. Om een attribuut in te stellen, wordt de constante NSAttributedStringKey gebruikt en wordt er een object van het juiste type aan toegewezen.
| Attribuutsleutel | Waardetype | Doel |
|---|---|---|
| .font | UIFont | Lettertype en tekstgrootte |
| .foregroundColor | UIColor | Tekstkleur |
| .backgroundColor | UIColor | Achtergrondkleur onder de tekst |
| .paragraphStyle | NSParagraphStyle | Uitlijning, regelafstand, inspringingen |
| .kern | NSNumber (Float) | Spatiëring tussen tekens (kerning) |
| .underlineStyle | NSUnderlineStyle (Int) | Onderstrepingsstijl (single, double, thick, pattern) |
| .strikethroughStyle | NSUnderlineStyle (Int) | Doorhalingsstijl |
| .link | NSURL | URL voor interactieve hyperlink |
| .shadow | NSShadow | Tekstschaduw met offset, blurRadius en kleur |
| .baselineOffset | NSNumber (Float) | Verplaatsing van tekst ten opzichte van de basislijn |
NSMutableParagraphStyle — een object dat de visuele kenmerken van een alinea beheert: uitlijning (.alignment: .left, .center, .right, .justified), regelafstand (.lineSpacing), afstand tussen alinea's (.paragraphSpacing), inspringing van de eerste regel (.firstLineHeadIndent), linker- en rechterinspringing (.headIndent, .tailIndent) en tekstrichting (.baseWritingDirection). ParagraphStyle wordt toegepast op een bereik dat nieuwe regeltekens bevat, als dezelfde opmaak voor de hele alinea gewenst is.
Het maken van een NSAttributedString gebeurt via een initializer die een string en een attributenwoordenboek accepteert. De attributen worden op de hele string toegepast. Voor gemengde opmaak (verschillende attributen in verschillende delen van de string) wordt NSMutableAttributedString gebruikt met het later toevoegen van attributen aan specifieke bereiken. Objective-C gebruikt het woordenboek NSAttributedStringKey: UIFont, terwijl Swift het typeveilige woordenboek [NSAttributedString.Key: Any] gebruikt.
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)
Het voorbeeld demonstreert alinea-opmaak via NSMutableParagraphStyle. Centrering, regelafstand van 8 punten, afstand na alinea van 12 punten worden ingesteld. ParagraphStyle wordt toegevoegd aan het attributenwoordenboek onder de sleutel .paragraphStyle. NSAttributedString kopieert de doorgegeven paragraphStyle, dus na het maken van de string kan deze worden gewijzigd zonder de reeds gemaakte string te beïnvloeden.
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 — is een subklasse van NSAttributedString waarmee de inhoud en attributen na creatie kunnen worden gewijzigd. Belangrijkste methoden: addAttribute(_:value:range:) voor het toevoegen van één attribuut aan een bereik; addAttributes(_:range:) voor het toevoegen van meerdere attributen; setAttributes(_:range:) voor het vervangen van alle attributen in een bereik; removeAttribute(_:range:) voor het verwijderen van een attribuut; replaceCharacters(in:with:) voor het vervangen van tekst.
addAttribute en addAttributes voegen attributen toe aan bestaande, zonder reeds ingestelde attributen te verwijderen. Als er in het bereik al een attribuut met dezelfde sleutel bestaat, wordt de waarde ervan vervangen. setAttributes vervangt het attributenwoordenboek voor het bereik volledig — alle eerder ingestelde attributen worden verwijderd. Dit is belangrijk bij het sequentieel opmaken van één string: addAttributes is veiliger omdat het reeds ingestelde lettertypen en kleuren niet reset.
Bereiken (NSRange) worden gedefinieerd met de structuur NSRange(location: 0, length: 5). location — de startindex (0-gebaseerd), length — het aantal tekens. Als een bereik de grenzen van de string overschrijdt, genereert NSMutableAttributedString een NSRangeException-uitzondering. Voor veilig werken met bereiken worden de NSRange-methoden uit Foundation gebruikt, zoals NSIntersectionRange en 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)
De meest gebruikelijke manier om NSAttributedString weer te geven — toewijzing aan de eigenschap attributedText van UILabel. In tegenstelling tot de eigenschap text, gebruikt attributedText attributen voor rendering en ondersteunt het gemengde opmaak. Belangrijk: als attributedText is ingesteld, negeert UILabel de eigenschappen font, textColor, textAlignment — alle visuele kenmerken komen uit de attributen van NSAttributedString.
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 ondersteunt interactieve links in NSAttributedString. Het attribuut .link met NSURL maakt de tekst klikbaar. Voor het afhandelen van klikken wordt de delegate UITextViewDelegate gebruikt met de methode textView(_:shouldInteractWith:in:interaction:). UITextView ondersteunt ook tekstselectie en het gebruik van UIMenuController voor standaardbewerkingen (kopiëren, zoeken).
NSAttributedString ondersteunt conversie van HTML en RTF via NSAttributedString.DocumentType. Voor het laden van HTML wordt de initializer gebruikt met parameters documentAttributes: NSAttributedString(data: htmlData, options: [.documentType: .html], documentAttributes: nil). Hetzelfde voor RTF: .rtf of .rtfd. Dit mechanisme is handig voor het weergeven van HTML-inhoud zonder WebView.
Voor export naar HTML wordt de methode data(from:documentAttributes:) gebruikt met een bereik en documenttype. HTML-export: try attributedString.data(from: fullRange, documentAttributes: [.documentType: .html]). De verkregen gegevens kunnen worden opgeslagen in een bestand, naar de server worden verzonden of in een WebView worden weergegeven. Bij export blijven lettertypen, kleuren, uitlijning en lijsten behouden — alle opmaakattributen worden geconverteerd naar CSS-stijlen.
Ondersteuning voor RTF is vooral relevant voor macOS-applicaties, waar RTF het standaardformaat voor rijke tekst is. iOS ondersteunt ook het lezen en schrijven van RTF, maar gebruikt het niet als primair formaat. Het verschil tussen RTF en RTFD: RTFD bevat geneste bronnen (afbeeldingen) verpakt in een map. NSAttributedString kan beide formaten verwerken via een uniforme interface.
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)
Veelgestelde vragen
NSString slaat alleen een reeks Unicode-tekens op zonder enige opmaakinformatie. NSAttributedString slaat tekens op en bevat voor elk subbereik een woordenboek van attributen (lettertype, kleur, stijl). Bij het weergeven van NSAttributedString gebruikt UIKit deze attributen voor rendering, waardoor opgemaakte tekst ontstaat.
De meest voorkomende oorzaak — het gebruik van de eigenschap text in plaats van attributedText. Bij toewijzing via text worden alle attributen genegeerd. De tweede oorzaak: na het instellen van attributedText wijzigt u font, textColor of textAlignment van UILabel — deze wijzigingen resetten attributedText. Gebruik alleen attributedText voor opgemaakte tekst.
Maak een NSMutableAttributedString en roep addAttribute(.font, value: boldFont, range: boldRange) aan voor elk deel met een ander lettertype. Elke aanroep past het attribuut alleen toe op het opgegeven bereik. De overige tekens behouden het standaardlettertype of een ander eerder ingesteld lettertype. Zo ontstaan attribuutbereiken (attribute runs) met verschillende lettertypen.
Ja, NSAttributedString verwerkt meerregelige tekst correct, inclusief nieuwe regeltekens ( ). UITextView en UILabel (met numberOfLines = 0) verplaatsen de tekst automatisch naar een nieuwe regel. NSMutableParagraphStyle beheert de regelafstand, inspringingen en uitlijning voor elke alinea onafhankelijk.
Gebruik NSMutableAttributedString met het attribuut .foregroundColor voor elk kleurbereik. Voor rode tekst: addAttribute(.foregroundColor, value: UIColor.red, range: firstRange). Voor blauw: addAttribute(.foregroundColor, value: UIColor.blue, range: secondRange). De kleuren worden alleen toegepast op de opgegeven tekenbereiken.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook