NSAttributedString — vad är det, textformatering och attribut i iOS

Författare: IT Sectr Publicerad: 2026-07-23 Lästid: 9 min

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 — oföränderlig sträng med attribut, där varje tecken eller intervall motsvarar en NSAttributedStringKey-attributordbok
  • NSMutableAttributedString — föränderlig version med metoderna addAttribute, setAttributes, replaceCharacters för att ändra attribut under körning
  • Huvudattribut: .font, .foregroundColor, .paragraphStyle, .kern, .underlineStyle, .strikethroughStyle, .link, .backgroundColor
  • NSMutableParagraphStyle — hjälpobjekt för att ställa in justering, radavstånd, indrag och textriktning
  • UILabel, UITextView, UITextField stöder attributedText för att visa attribuerade strängar

Vad är NSAttributedString?

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.

Huvudattribut för textformatering

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.

AttributnyckelVärdetypSyfte
.fontUIFontTypsnitt och textstorlek
.foregroundColorUIColorTextfärg
.backgroundColorUIColorBakgrundsfärg under texten
.paragraphStyleNSParagraphStyleJustering, radavstånd, indrag
.kernNSNumber (Float)Mellanrum mellan tecken (kerning)
.underlineStyleNSUnderlineStyle (Int)Understrykningsstil (single, double, thick, pattern)
.strikethroughStyleNSUnderlineStyle (Int)Genomstrykningsstil
.linkNSURLURL för interaktiv hyperlänk
.shadowNSShadowTextskugga med offset, blurRadius och färg
.baselineOffsetNSNumber (Float)Förskjutning av text i förhållande till baslinjen

NSParagraphStyle — styckeformatering

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.

Hur man skapar NSAttributedString i kod

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].

swift
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)

Skapa med NSMutableParagraphStyle

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.

swift
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 och ändring av attribut

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.

swift
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)

Exempel på visning av attribuerad sträng i UILabel

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.

swift
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

Visning i UITextView med interaktiva länkar

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).

Konvertering av NSAttributedString till HTML och RTF

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.

swift
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

Vad är skillnaden mellan NSString och NSAttributedString?

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.

Varför visar inte UILabel attributen för NSAttributedString?

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.

Hur tillämpar jag olika typsnitt på en sträng?

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.

Fungerar NSAttributedString med flerradig text?

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.

Hur skapar jag färgad text med olika färger i en sträng?

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

  • NSAttributedString — sträng med formateringsattribut (typsnitt, färg, stil) lagrade i en ordbok för varje teckenintervall
  • NSMutableAttributedString — föränderlig version med metoderna addAttribute, setAttributes och removeAttribute för dynamisk formatering
  • Huvudattribut: .font, .foregroundColor, .paragraphStyle, .kern, .underlineStyle, .strikethroughStyle, .link, .shadow, .baselineOffset
  • NSMutableParagraphStyle hanterar justering, radavstånd, indrag och textriktning för stycken
  • UILabel, UITextView, UITextField stöder visning av formaterad text via egenskapen attributedText
  • HTML/RTF-konvertering — NSAttributedString stöder import och export av formaterad text via documentType

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.

Diskutera projektet

Läs också