Attributed Text är en mekanism i iOS SDK, representerad av klasserna NSAttributedString och NSMutableAttributedString, som gör det möjligt att tillämpa flera stilar på olika delar av en enda textsträng. Till skillnad från vanlig NSString lagrar Attributed String inte bara tecken utan även en ordbok med attribut för varje omfång: typsnitt, färg, radavstånd, skugga och justering. Enligt Apple Developer Documentation är Attributed String grunden för att visa formaterad text i UILabel, UITextView och UITextField. Det är standardsättet att stilera text utan WebKit eller tredjepartsbibliotek.
Huvudpunkter
NSAttributedString är en klass i Foundation-ramverket som representerar en sträng med en uppsättning namngivna attribut bundna till teckenomfång. Varje attribut är ett nyckel-värdepar: nyckeln definieras av en konstant (NSFontAttributeName, NSForegroundColorAttributeName) och värdet av ett motsvarande objekt (UIFont, UIColor). Attribut tillämpas på ett teckenomfång via NSRange.
Klassen finns tillgänglig på alla Apple-plattformar: iOS (2.0+), macOS, tvOS, watchOS. NSAttributedString är oföränderlig — efter skapande är dess attribut fixerade. För dynamisk ändring används NSMutableAttributedString, som ärver från NSAttributedString och lägger till metoderna setAttributes, addAttributes, addAttribute, removeAttribute.
NSString är en enkel teckensträng utan stilinformation. All text som skickas till UILabel via text visas med ett typsnitt, en färg och en storlek. NSAttributedString som skickas via attributedText tillåter varje tecken att ha sin egen uppsättning attribut. UILabel, UITextView och UITextField känner automatiskt igen NSAttributedString och renderar texten enligt attributen.
Internt lagrar NSAttributedString en NSString med texten och en array av attributomfång. Varje omfång representeras av en NSRange-struktur och en attributordbok. Vid rendering går systemet igenom omfången och tillämpar motsvarande attribut på varje del. Effektiviteten beror på antalet attributväxlingar — frekventa byten på korta delar ökar renderingstiden.
Attribut för NSAttributedString är konstanter definierade i UIKit (iOS) och AppKit (macOS), som var och en motsvarar en specifik aspekt av visuell textformatering. Alla attribut är strängar av NSAttributedString.Key och deras värden är objekt av specifika klasser. Attribut delas in i teckenattribut (påverkar tecken) och styckeattribut (påverkar stycken).
Teckenattribut omfattar typsnitt (NSFontAttributeName), textfärg (NSForegroundColorAttributeName), bakgrundsfärg (NSBackgroundColorAttributeName), understrykning (NSUnderlineStyleAttributeName), genomstrykning (NSStrikethroughStyleAttributeName), skugga (NSShadowAttributeName). Styckeattribut ställs in via NSParagraphStyleAttributeName, som styr justering, indrag, radavstånd och tabulering.
NSLinkAttributeName skapar en klickbar länk i texten: värdet är en URL eller sträng. UITextView bearbetar automatiskt sådana länkar om interaktion är aktiverad. NSAttachmentAttributeName möjliggör inbäddning av ett NSTextAttachment — en bild i texten som visas som ett inline-element. Detta används för att skapa text med ikoner, emojis eller anpassade vyer inuti strängen.
Varje attribut i NSAttributedString har ett strikt typat värde. Låt oss titta på de mest använda attributen inom iOS-utveckling. Typsnitt ställs in av ett UIFont-objekt, färg av UIColor, radavstånd via NSMutableParagraphStyle, som gör det möjligt att konfigurera justering, indrag och avstånd i ett objekt.
| Attributnyckel | Värdetyp | Syfte |
|---|---|---|
| NSFontAttributeName | UIFont | Textens typsnitt |
| NSForegroundColorAttributeName | UIColor | Textfärg |
| NSBackgroundColorAttributeName | UIColor | Bakgrundsfärg under texten |
| NSUnderlineStyleAttributeName | NSNumber (Int) | Understrykningsstil |
| NSParagraphStyleAttributeName | NSParagraphStyle | Styckeinställningar |
| NSKernAttributeName | NSNumber (Float) | Bokstavsavstånd |
NSParagraphStyle är en behållare för styckeattribut: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight och andra. För att ändra dessa parametrar skapas en NSMutableParagraphStyle, önskade egenskaper konfigureras och objektet skickas som värdet av attributet NSParagraphStyleAttributeName. Detta är det enda sättet att kontrollera radavstånd i NSAttributedString.
NSShadow gör det möjligt att lägga till en skugga till texten: parametrarna shadowOffset, shadowBlurRadius, shadowColor ställer in förskjutning, oskärpa och färg på skuggan. Attributen för understrykning och genomstrykning accepterar kombinationer av stilar: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. För exakt kontroll över linjernas tjocklek och färg används NSUnderlineColorAttributeName och NSStrikethroughColorAttributeName.
Att skapa en NSAttributedString i Swift görs via en initierare med angivande av text och attributordbok, eller via NSMutableAttributedString med stegvis tillämpning av stilar. Grundläggande tillvägagångssätt — definiera en attributordbok för hela texten, sedan lägga till eller ändra attribut för enskilda omfång.
Ett enkelt exempel — ställa in typsnitt, färg och justering för hela strängen. Attributordboken skickas till NSAttributedStrings initierare. Ordbokens nycklar är konstanter NSAttributedString.Key, värdena är motsvarande UIKit-objekt. Detta är grundvarianten när hela texten formateras enhetligt.
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
Texten visas med typsnitt systemFont 16, mörkgrå färg, centrerad justering och radavstånd på 4pt. Detta tillvägagångssätt är bekvämt för statiska rubriker och knappar.
NSMutableAttributedString gör det möjligt att tillämpa olika stilar på olika delar av texten. Metoden addAttribute lägger till ett attribut till ett omfång, addAttributes — en attributordbok. Metoden setAttributes ersätter alla attribut i omfånget med nya. Detta är det främsta verktyget för att skapa text med markeringar.
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
Ordet “1999” blir grönt och fetstilt, resten av texten — standard. NSRange beräknas manuellt — det är viktigt att räkna längden korrekt i tecken, särskilt när man arbetar med emojis och sammansatta Unicode-tecken.
NSMutableAttributedString tillhandahåller metoder för dynamisk ändring av text och attribut: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. Detta gör det möjligt att bygga text från olika källor, kombinera stilar och reagera på gränssnittshändelser.
Till skillnad från oföränderlig NSAttributedString stöder den muterbara versionen ändring av innehåll utan att skapa ett nytt objekt. Detta är avgörande för textredigerare, chattar och formulär där användaren kan redigera text och stilarna måste bevaras.
I meddelandeapplikationer innehåller varje meddelande användarnamn (fetstilt typsnitt), meddelandetext (normal), tid (grå färg). NSMutableAttributedString gör det möjligt att bygga en sådan sträng på en gång, genom att lägga till delar i rätt ordning med lämpliga attribut.
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
Resultatet — en sträng med tre stilmässiga delar. Append beräknar automatiskt NSRange korrekt, positioner behöver inte beräknas manuellt. Detta tillvägagångssätt skalas till valfritt antal fragment.
Metoden enumerateAttributes(in:options:using:) går igenom alla attributomfång i det angivna intervallet. Detta är användbart för att analysera formatering: hitta alla länkar, ändra färg på vissa attribut eller exportera text till HTML. I closuren skickas attributordboken och NSRange för den aktuella delen.
Alla grundläggande UI-komponenter för textvisning i UIKit stöder NSAttributedString via egenskapen attributedText. UILabel visar statisk stiliserad text, UITextView stöder redigering och länkar, UITextField accepterar attribut separat för platshållare och inmatad text.
UILabel är den lättaste komponenten för att visa stiliserad text. Den stöder alla teckenattribut, men bearbetar inte klickbara länkar automatiskt (för det krävs UITextView). UILabel är idealisk för rubriker, etiketter och korta texter med formatering.
UITextView bearbetar NSLinkAttributeName och visar länkar som interaktiva element. För att aktivera denna funktionalitet, ställ in isSelectable = true och isEditable = false. När en länk klickas får delegaten anropet textView(_:shouldInteractWith:in:interaction:). UITextView stöder även NSTextAttachment för bilder i texten.
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
Efter konfigurering av isSelectable och isEditable beter sig textområdet som ett statiskt textblock, men länkarna förblir aktiva. Delegaten UITextViewDelegate hanterar beteendet vid klick.
Core Text är ett lågnivåramverk från Apple för textrendering som arbetar direkt med NSAttributedString. Till skillnad från UIKit använder Core Text inte NSAttributedString direkt som ett objekt att visa, utan konverterar det till CTFramesetter, sedan till CTFrame och renderar i en Core Graphics-kontext. Detta ger full kontroll över placeringen av rader och glyfer.
Användning av Core Text är motiverad för anpassade textlayouter: kolumner, textflöde runt bilder, textrotation, icke-standardiserade radbrytningar. Core Texts NSMutableParagraphStyle innehåller attribut som inte finns i UIKit: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode med ytterligare lägen.
NSAttributedString överförs sömlöst mellan UIKit och Core Text, eftersom båda ramverken arbetar med samma typ. UIKit-attribut (NSFontAttributeName, NSForegroundColorAttributeName) känns automatiskt igen av Core Text och vice versa — Core Text-attribut (kCTFontAttributeName) läses av UIKit. Detta gör det möjligt att använda UIKit för enkla uppgifter och Core Text för anpassad rendering på samma NSAttributedString-objekt.
Vanliga frågor
NSString lagrar bara text utan stilinformation. NSAttributedString kompletterar texten med en attributordbok för varje teckenomfång. När den skickas till UILabel via egenskapen text visas NSString som vanlig text. När NSAttributedString skickas via egenskapen attributedText tillämpas alla attribut: olika typsnitt, färger och avstånd i samma sträng.
Använd metoden addAttributes(_:range:) med en attributordbok: addAttributes([.font: font, .foregroundColor: color], range: range). För att lägga till eller ändra ett attribut, använd addAttribute(_:value:range:). Metoden setAttributes ersätter alla befintliga attribut i omfånget med nya.
Skapa en NSMutableParagraphStyle, ställ in egenskapen lineSpacing och skicka den sedan som värdet av attributet NSParagraphStyleAttributeName. För full kontroll finns även minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode och alignment tillgängliga. ParagraphStyle är det enda sättet att kontrollera radavståndet.
Ja, SwiftUI stöder NSAttributedString via Text(attributedString:) i iOS 15+. I äldre versioner, använd UIViewRepresentable med UILabel eller UITextView. SwiftUI tillhandahåller också sin egen typ AttributedString (SwiftUI, inte Foundation) för deklarativ formatering med Markdown-liknande syntax.
Använd metoden boundingRect(with:options:context:), som returnerar den CGRect som krävs för att visa strängen med angivna attribut. Parametern options: [.usesLineFragmentOrigin, .usesFontLeading] tar hänsyn till radavstånd och typsnittsmetrik. För UILabel med begränsat antal rader, använd sizeThatFits.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också