Attributed Text is een mechanisme van iOS SDK, vertegenwoordigd door de klassen NSAttributedString en NSMutableAttributedString, waarmee meerdere stijlen kunnen worden toegepast op verschillende delen van een enkele tekstreeks. In tegenstelling tot gewone NSString, slaat Attributed String niet alleen tekens op, maar ook een woordenboek van attributen voor elk bereik: lettertype, kleur, regelafstand, schaduw en uitlijning. Volgens Apple Developer Documentation vormt Attributed String de basis voor het weergeven van opgemaakte tekst in UILabel, UITextView en UITextField. Het is de standaard manier om tekst te stylen zonder WebKit of externe bibliotheken.
Belangrijkste punten
NSAttributedString is een klasse van het Foundation-framework die een reeks voorstelt met een set benoemde attributen die aan tekenbereiken zijn gekoppeld. Elk attribuut is een sleutel-waardepaar: de sleutel wordt gedefinieerd door een constante (NSFontAttributeName, NSForegroundColorAttributeName) en de waarde door een overeenkomstig object (UIFont, UIColor). Attributen worden toegepast op een tekenbereik via NSRange.
De klasse is beschikbaar op alle Apple-platforms: iOS (2.0+), macOS, tvOS, watchOS. NSAttributedString is onveranderlijk — na creatie zijn de attributen vast. Voor dynamische wijziging wordt NSMutableAttributedString gebruikt, dat overerft van NSAttributedString en methoden setAttributes, addAttributes, addAttribute, removeAttribute toevoegt.
NSString is een eenvoudige tekenreeks zonder stijlinformatie. Elke tekst die via text aan UILabel wordt doorgegeven, wordt weergegeven met één lettertype, kleur en grootte. NSAttributedString dat via attributedText wordt doorgegeven, laat elk teken zijn eigen set attributen hebben. UILabel, UITextView en UITextField herkennen automatisch NSAttributedString en geven de tekst weer volgens de attributen.
Intern slaat NSAttributedString een NSString met de tekst en een array van attribuutbereiken op. Elk bereik wordt weergegeven door een NSRange-structuur en een attributenwoordenboek. Bij het renderen doorloopt het systeem de bereiken en past de overeenkomstige attributen toe op elk deel. De efficiëntie hangt af van het aantal attribuutswitches — frequente wisselingen op korte delen verhogen de renderingstijd.
Attributen van NSAttributedString zijn constanten gedefinieerd in UIKit (iOS) en AppKit (macOS), die elk overeenkomen met een specifiek aspect van visuele tekstopmaak. Alle attributen zijn strings van NSAttributedString.Key en hun waarden zijn objecten van specifieke klassen. Attributen worden onderverdeeld in tekenattributen (beïnvloeden tekens) en alineaattributen (beïnvloeden alinea's).
Tekenattributen omvatten lettertype (NSFontAttributeName), tekstkleur (NSForegroundColorAttributeName), achtergrondkleur (NSBackgroundColorAttributeName), onderstreping (NSUnderlineStyleAttributeName), doorhaling (NSStrikethroughStyleAttributeName), schaduw (NSShadowAttributeName). Alineaattributen worden ingesteld via NSParagraphStyleAttributeName, die uitlijning, inspringingen, regelafstand en tabulatie regelt.
NSLinkAttributeName maakt een klikbare link in de tekst: de waarde is een URL of string. UITextView verwerkt dergelijke links automatisch als interactie is ingeschakeld. NSAttachmentAttributeName maakt het mogelijk om een NSTextAttachment in te sluiten — een afbeelding in de tekst die wordt weergegeven als inline-element. Dit wordt gebruikt voor het maken van tekst met pictogrammen, emoji's of aangepaste weergaven in de reeks.
Elk attribuut van NSAttributedString heeft een strikt getypeerde waarde. Laten we de meest gebruikte attributen in iOS-ontwikkeling bekijken. Het lettertype wordt ingesteld door een UIFont-object, de kleur door UIColor, de regelafstand via NSMutableParagraphStyle, waarmee uitlijning, inspringingen en afstanden in één object kunnen worden geconfigureerd.
| Attribuutsleutel | Waardetype | Doel |
|---|---|---|
| NSFontAttributeName | UIFont | Lettertype van de tekst |
| NSForegroundColorAttributeName | UIColor | Tekstkleur |
| NSBackgroundColorAttributeName | UIColor | Achtergrondkleur onder de tekst |
| NSUnderlineStyleAttributeName | NSNumber (Int) | Onderstrepingsstijl |
| NSParagraphStyleAttributeName | NSParagraphStyle | Alinea-instellingen |
| NSKernAttributeName | NSNumber (Float) | Letterafstand |
NSParagraphStyle is een container voor alinea-attributen: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight en andere. Om deze parameters te wijzigen, wordt een NSMutableParagraphStyle gemaakt, worden de gewenste eigenschappen geconfigureerd en wordt het object doorgegeven als waarde van het attribuut NSParagraphStyleAttributeName. Dit is de enige manier om de regelafstand in NSAttributedString te beheren.
NSShadow maakt het mogelijk om een schaduw aan tekst toe te voegen: de parameters shadowOffset, shadowBlurRadius, shadowColor bepalen de verschuiving, vervaging en kleur van de schaduw. De attributen voor onderstreping en doorhaling accepteren combinaties van stijlen: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. Voor nauwkeurige controle over de dikte en kleur van lijnen worden NSUnderlineColorAttributeName en NSStrikethroughColorAttributeName gebruikt.
Het maken van NSAttributedString in Swift gebeurt via een initialisator met opgave van tekst en attributenwoordenboek, of via NSMutableAttributedString met stapsgewijze toepassing van stijlen. De basisbenadering — een attributenwoordenboek definiëren voor de hele tekst, vervolgens attributen toevoegen of wijzigen voor afzonderlijke bereiken.
Een eenvoudig voorbeeld — het instellen van lettertype, kleur en uitlijning voor de hele reeks. Het attributenwoordenboek wordt doorgegeven aan de initialisator van NSAttributedString. De sleutels van het woordenboek zijn constanten van NSAttributedString.Key, de waarden zijn overeenkomstige UIKit-objecten. Dit is de basisvariant wanneer de hele tekst uniform wordt opgemaakt.
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
De tekst wordt weergegeven met lettertype systemFont 16, donkergrijze kleur, gecentreerde uitlijning en regelafstand van 4pt. Deze benadering is handig voor statische koppen en knoppen.
NSMutableAttributedString maakt het mogelijk om verschillende stijlen toe te passen op verschillende delen van de tekst. De methode addAttribute voegt één attribuut toe aan een bereik, addAttributes — een attributenwoordenboek. De methode setAttributes vervangt alle attributen van het bereik door nieuwe. Dit is het belangrijkste hulpmiddel voor het maken van tekst met markeringen.
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
Het woord „1999“ wordt groen en vetgedrukt, de rest van de tekst — standaard. NSRange wordt handmatig berekend — het is belangrijk om de lengte correct in tekens te tellen, vooral bij het werken met emoji's en samengestelde Unicode-tekens.
NSMutableAttributedString biedt methoden voor dynamische wijziging van tekst en attributen: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. Dit maakt het mogelijk om tekst uit verschillende bronnen op te bouwen, stijlen te combineren en te reageren op interfacegebeurtenissen.
In tegenstelling tot onveranderlijke NSAttributedString ondersteunt de mutable versie wijziging van inhoud zonder een nieuw object te maken. Dit is essentieel voor teksteditors, chats en formulieren, waar de gebruiker tekst kan bewerken en stijlen behouden moeten blijven.
In berichtentoepassingen bevat elk bericht de gebruikersnaam (vetgedrukt), de berichttekst (normaal), de tijd (grijze kleur). NSMutableAttributedString maakt het mogelijk om zo'n reeks in één keer op te bouwen, door delen in de juiste volgorde met de juiste attributen toe te voegen.
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
Het resultaat — één reeks met drie stijlvolle delen. Append berekent automatisch correct de NSRange, posities hoeven niet handmatig te worden berekend. Deze benadering schaalt naar elk aantal fragmenten.
De methode enumerateAttributes(in:options:using:) doorloopt alle attribuutbereiken in het opgegeven interval. Dit is nuttig voor het analyseren van opmaak: het vinden van alle links, het wijzigen van de kleur van bepaalde attributen of het exporteren van tekst naar HTML. In de closure worden het attributenwoordenboek en de NSRange van het huidige deel doorgegeven.
Alle basis UI-componenten voor tekstweergave in UIKit ondersteunen NSAttributedString via de eigenschap attributedText. UILabel geeft statische gestileerde tekst weer, UITextView ondersteunt bewerken en links, UITextField accepteert attributen afzonderlijk voor placeholder en ingevoerde tekst.
UILabel is de lichtste component voor het weergeven van gestileerde tekst. Het ondersteunt alle tekenattributen, maar verwerkt klikbare links niet automatisch (daarvoor is UITextView nodig). UILabel is ideaal voor koppen, labels en korte teksten met opmaak.
UITextView verwerkt NSLinkAttributeName en geeft links weer als interactieve elementen. Om deze functionaliteit in te schakelen, stelt u isSelectable = true en isEditable = false in. Bij het klikken op een link ontvangt de delegate de aanroep textView(_:shouldInteractWith:in:interaction:). UITextView ondersteunt ook NSTextAttachment voor afbeeldingen in de tekst.
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
Na het configureren van isSelectable en isEditable gedraagt het tekstgebied zich als een statisch tekstblok, maar blijven de links actief. De delegate UITextViewDelegate beheert het gedrag bij klikken.
Core Text is een low-level framework van Apple voor het renderen van tekst dat rechtstreeks met NSAttributedString werkt. In tegenstelling tot UIKit gebruikt Core Text NSAttributedString niet direct als weer te geven object, maar converteert het naar CTFramesetter, vervolgens naar CTFrame en rendert het in een Core Graphics-context. Dit geeft volledige controle over de plaatsing van regels en glyphs.
Het gebruik van Core Text is gerechtvaardigd voor aangepaste tekst lay-outs: kolommen, tekst rond afbeeldingen, tekstrotatie, niet-standaard regelafbrekingen. NSMutableParagraphStyle van Core Text bevat attributen die niet in UIKit bestaan: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode met extra modi.
NSAttributedString wordt naadloos overgedragen tussen UIKit en Core Text, omdat beide frameworks met hetzelfde type werken. UIKit-attributen (NSFontAttributeName, NSForegroundColorAttributeName) worden automatisch herkend door Core Text en omgekeerd — Core Text-attributen (kCTFontAttributeName) worden gelezen door UIKit. Dit maakt het mogelijk om UIKit te gebruiken voor eenvoudige taken en Core Text voor aangepaste rendering op hetzelfde NSAttributedString-object.
Veelgestelde vragen
NSString slaat alleen tekst op zonder stijlinformatie. NSAttributedString vult de tekst aan met een attributenwoordenboek voor elk tekenbereik. Bij doorgeven aan UILabel via de eigenschap text wordt NSString weergegeven als platte tekst. Bij doorgeven van NSAttributedString via de eigenschap attributedText worden alle attributen toegepast: verschillende lettertypes, kleuren en afstanden in één reeks.
Gebruik de methode addAttributes(_:range:) met een attributenwoordenboek: addAttributes([.font: font, .foregroundColor: color], range: range). Om één attribuut toe te voegen of te wijzigen, gebruikt u addAttribute(_:value:range:). De methode setAttributes vervangt alle bestaande attributen in het bereik door nieuwe.
Maak een NSMutableParagraphStyle, stel de eigenschap lineSpacing in en geef deze vervolgens door als waarde van het attribuut NSParagraphStyleAttributeName. Voor volledige controle zijn ook minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode en alignment beschikbaar. ParagraphStyle is de enige manier om de regelafstand te beheren.
Ja, SwiftUI ondersteunt NSAttributedString via Text(attributedString:) in iOS 15+. In oudere versies gebruikt u UIViewRepresentable met UILabel of UITextView. SwiftUI biedt ook zijn eigen type AttributedString (SwiftUI, niet Foundation) voor declaratieve opmaak met Markdown-achtige syntaxis.
Gebruik de methode boundingRect(with:options:context:), die de CGRect retourneert die nodig is om de reeks met de opgegeven attributen weer te geven. De parameter options: [.usesLineFragmentOrigin, .usesFontLeading] houdt rekening met regelafstanden en lettertypemetrieken. Voor UILabel met een beperkt aantal regels gebruikt u sizeThatFits.
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