NSAttributedString — är en klass från Foundation-ramverket i iOS SDK som representerar en sträng med en uppsättning formateringsattribut som tillämpas på enskilda tecken eller textintervall. Till skillnad från vanliga NSString lagrar NSAttributedString inte bara Unicode-tecken, utan även en ordbok med attribut (typsnitt, färg, mellanrum mellan tecken, justering) för varje segment av strängen. Enligt Apple Developer Documentation (2026) är NSAttributedString grunden för att visa formaterad text i alla UI-komponenter i iOS.
Huvudpunkter
NSAttributedString — är en grundläggande klass i iOS/macOS för att arbeta med formaterad text. Den utökar NSStrings möjligheter genom att lägga till attribut till strängen — en ordbok med nyckel-värdepar, där nyckeln är en NSAttributedStringKey-konstant (t.ex. .font, .foregroundColor) och värdet är motsvarande objekt (UIFont, UIColor). Varje tecken i strängen kan ha sin egen uppsättning attribut, vilket möjliggör blandad formatering i en enda sträng.
Arkitekturen för NSAttributedString är baserad på konceptet med attributintervall (attribute runs). Om du ställer in attributet .font = UIFont.boldSystemFont(ofSize: 16) för teckenintervallet 0..5, kommer alla tecken i detta intervall att visas i fetstil. De återstående tecknen kan ha ett annat typsnitt eller inte ha något attribut alls. När en attribuerad sträng visas kombinerar UIKit-systemet egenskaper från olika intervall och renderar texten enhetligt.
NSAttributedString är oföränderlig — efter skapande kan dess attribut och innehåll inte ändras. För ändringar finns underklassen NSMutableAttributedString, som tillhandahåller metoder för att lägga till, ta bort och ändra attribut i valfria intervall. Denna skillnad är viktig för flertrådning: oföränderlig NSAttributedString är trådsäker, medan NSMutableAttributedString inte är det.
NSAttributedString stöder cirka 40 standardattribut definierade i NSAttributedStringKey. Varje attribut påverkar en specifik aspekt av textens utseende: typsnitt, färg, position, understrykning, skugga, mellanrum mellan tecken, styckestil och hyperlänkar. För att ställa in ett attribut används konstanten NSAttributedStringKey, och ett objekt av motsvarande typ tilldelas den.
| Attributnyckel | Värdetyp | Syfte |
|---|---|---|
| .font | UIFont | Typsnitt och textstorlek |
| .foregroundColor | UIColor | Textfärg |
| .backgroundColor | UIColor | Bakgrundsfärg under texten |
| .paragraphStyle | NSParagraphStyle | Justering, radavstånd, indrag |
| .kern | NSNumber (Float) | Mellanrum mellan tecken (kerning) |
| .underlineStyle | NSUnderlineStyle (Int) | Understrykningsstil (single, double, thick, pattern) |
| .strikethroughStyle | NSUnderlineStyle (Int) | Genomstrykningsstil |
| .link | NSURL | URL för interaktiv hyperlänk |
| .shadow | NSShadow | Textskugga med offset, blurRadius och färg |
| .baselineOffset | NSNumber (Float) | Förskjutning av text i förhållande till baslinjen |
NSMutableParagraphStyle — objekt som hanterar visuella egenskaper för ett stycke: justering (.alignment: .left, .center, .right, .justified), radavstånd (.lineSpacing), avstånd mellan stycken (.paragraphSpacing), indrag för första raden (.firstLineHeadIndent), vänster och höger indrag (.headIndent, .tailIndent) och textriktning (.baseWritingDirection). ParagraphStyle tillämpas på ett intervall som innehåller nya radtecken, om samma formatering önskas för hela stycket.
Skapande av NSAttributedString sker via en initierare som tar en sträng och en attributordbok. Attributen tillämpas på hela strängen. För blandad formatering (olika attribut i olika delar av strängen) används NSMutableAttributedString med efterföljande tillägg av attribut till specifika intervall. Objective-C använder ordboken NSAttributedStringKey: UIFont, medan Swift använder den typsäkra ordboken [NSAttributedString.Key: Any].
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)
Exemplet visar styckeformatering via NSMutableParagraphStyle. Centrerad justering, radavstånd på 8 punkter, avstånd efter stycke på 12 punkter ställs in. ParagraphStyle läggs till i attributordboken under nyckeln .paragraphStyle. NSAttributedString kopierar den skickade paragraphStyle, så efter att strängen skapats kan den ändras utan att påverka den redan skapade strängen.
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 — är en underklass till NSAttributedString som tillåter ändring av innehåll och attribut efter skapande. Huvudmetoder: addAttribute(_:value:range:) för att lägga till ett attribut till ett intervall; addAttributes(_:range:) för att lägga till flera attribut; setAttributes(_:range:) för att ersätta alla attribut i ett intervall; removeAttribute(_:range:) för att ta bort ett attribut; replaceCharacters(in:with:) för att ersätta text.
addAttribute och addAttributes lägger till attribut till befintliga, utan att ta bort redan inställda. Om det i intervallet redan finns ett attribut med samma nyckel ersätts dess värde. setAttributes ersätter helt attributordboken för intervallet — alla tidigare inställda attribut tas bort. Detta är viktigt vid sekventiell formatering av en sträng: addAttributes är säkrare eftersom det inte återställer redan inställda typsnitt och färger.
Intervall (NSRange) definieras med strukturen NSRange(location: 0, length: 5). location — startindex (0-baserat), length — antal tecken. Om intervallet överskrider strängens gränser genererar NSMutableAttributedString ett undantag NSRangeException. För säker hantering av intervall används NSRange-metoder från Foundation, som NSIntersectionRange och 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)
Det vanligaste sättet att visa NSAttributedString — tilldelning till egenskapen attributedText för UILabel. Till skillnad från egenskapen text använder attributedText attribut för rendering och stöder blandad formatering. Viktigt: om attributedText är inställd ignorerar UILabel egenskaperna font, textColor, textAlignment — alla visuella egenskaper kommer från 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 stöder interaktiva länkar i NSAttributedString. Attributet .link med NSURL gör texten klickbar. För att hantera klick används delegaten UITextViewDelegate med metoden textView(_:shouldInteractWith:in:interaction:). UITextView stöder också textmarkering och användning av UIMenuController för standardoperationer (kopiera, sök).
NSAttributedString stöder konvertering från HTML och RTF via NSAttributedString.DocumentType. För att ladda HTML används initieraren med parametrarna documentAttributes: NSAttributedString(data: htmlData, options: [.documentType: .html], documentAttributes: nil). Likadant för RTF: .rtf eller .rtfd. Denna mekanism är användbar för att visa HTML-innehåll utan WebView.
För export till HTML används metoden data(from:documentAttributes:) med ett intervall och dokumenttyp. HTML-export: try attributedString.data(from: fullRange, documentAttributes: [.documentType: .html]). De erhållna data kan sparas i en fil, skickas till servern eller visas i en WebView. Vid export bevaras typsnitt, färger, justering, listor — alla formateringsattribut konverteras till CSS-stilar.
Stöd för RTF är särskilt relevant för macOS-applikationer, där RTF är standardformatet för rich text. iOS stöder också läsning och skrivning av RTF, men använder det inte som primärt format. Skillnaden mellan RTF och RTFD: RTFD innehåller nästlade resurser (bilder) packade i en katalog. NSAttributedString kan bearbeta båda formaten via ett enhetligt gränssnitt.
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)
Vanliga frågor
NSString lagrar bara en sekvens av Unicode-tecken utan någon formateringsinformation. NSAttributedString lagrar tecken och för varje delintervall innehåller en ordbok med attribut (typsnitt, färg, stil). När NSAttributedString visas använder UIKit dessa attribut för rendering, vilket skapar formaterad text.
Den vanligaste orsaken — användning av egenskapen text istället för attributedText. Vid tilldelning via text ignoreras alla attribut. Den andra orsaken: efter att ha ställt in attributedText ändrar du font, textColor eller textAlignment för UILabel — dessa ändringar återställer attributedText. Använd endast attributedText för formaterad text.
Skapa en NSMutableAttributedString och anropa addAttribute(.font, value: boldFont, range: boldRange) för varje del med olika typsnitt. Varje anrop tillämpar attributet endast på det angivna intervallet. De återstående tecknen behåller standardtypsnittet eller ett annat tidigare inställt typsnitt. På så sätt skapas attributintervall (attribute runs) med olika typsnitt.
Ja, NSAttributedString hanterar flerradig text korrekt, inklusive nya radtecken ( ). UITextView och UILabel (med numberOfLines = 0) flyttar automatiskt texten till en ny rad. NSMutableParagraphStyle hanterar radavstånd, indrag och justering för varje stycke oberoende.
Använd NSMutableAttributedString med attributet .foregroundColor för varje färgintervall. För röd text: addAttribute(.foregroundColor, value: UIColor.red, range: firstRange). För blå: addAttribute(.foregroundColor, value: UIColor.blue, range: secondRange). Färgerna appliceras endast på de angivna teckenintervallen.
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å