Attributed Text: co to je, typy atributů a stylizace

Autor: IT Sectr Publikováno: 2026-07-23 Doba čtení: 8 min

Attributed Text je mechanismus iOS SDK, reprezentovaný třídami NSAttributedString a NSMutableAttributedString, který umožňuje aplikovat více stylů na různé části jednoho textového řetězce. Na rozdíl od běžného NSString, Attributed String ukládá nejen znaky, ale také slovník atributů pro každý rozsah: písmo, barvu, řádkování, stín a zarovnání. Podle Apple Developer Documentation je Attributed String základem pro zobrazení formátovaného textu v UILabel, UITextView a UITextField. Je to standardní způsob stylizace textu bez WebKit nebo knihoven třetích stran.

Hlavní body

  • NSAttributedString — neměnná třída pro stylizaci textu pomocí slovníků atributů v iOS
  • Atributy zahrnují písmo, barvu, řádkování, stín, podtržení a zarovnání
  • NSMutableAttributedString — měnitelná verze pro dynamické aplikování stylů
  • addAttributes aplikuje slovník atributů na rozsah, addAttribute — jeden atribut
  • NSAttributedString se používá v UILabel, UITextView, UITextField a Core Text

Co je Attributed Text v iOS?

NSAttributedString je třída frameworku Foundation, která reprezentuje řetězec se sadou pojmenovaných atributů vázaných na rozsahy znaků. Každý atribut je pár klíč-hodnota: klíč je definován konstantou (NSFontAttributeName, NSForegroundColorAttributeName) a hodnota odpovídajícím objektem (UIFont, UIColor). Atributy se aplikují na rozsah znaků pomocí NSRange.

Třída je dostupná na všech platformách Apple: iOS (2.0+), macOS, tvOS, watchOS. NSAttributedString je neměnný — po vytvoření jsou jeho atributy pevně dané. Pro dynamickou změnu se používá NSMutableAttributedString, který dědí z NSAttributedString a přidává metody setAttributes, addAttributes, addAttribute, removeAttribute.

Rozdíl od NSString

NSString je jednoduchý řetězec znaků bez informací o stylu. Jakýkoli text předaný UILabel přes text se zobrazí jedním písmem, barvou a velikostí. NSAttributedString předaný přes attributedText umožňuje každému znaku mít vlastní sadu atributů. UILabel, UITextView a UITextField automaticky rozpoznávají NSAttributedString a vykreslují text podle atributů.

Formát ukládání

Interně NSAttributedString ukládá NSString s textem a pole rozsahů atributů. Každý rozsah je reprezentován strukturou NSRange a slovníkem atributů. Při vykreslování systém prochází rozsahy a aplikuje odpovídající atributy na každou část. Efektivita závisí na počtu přepnutí atributů — časté změny na krátkých úsecích zvyšují dobu vykreslování.

Atributy NSAttributedString

Atributy NSAttributedString jsou konstanty definované v UIKit (iOS) a AppKit (macOS), z nichž každá odpovídá určitému aspektu vizuálního formátování textu. Všechny atributy jsou řetězce NSAttributedString.Key a jejich hodnoty jsou objekty určitých tříd. Atributy se dělí na znakové (ovlivňují znaky) a odstavcové (ovlivňují odstavce).

Znakové atributy zahrnují písmo (NSFontAttributeName), barvu textu (NSForegroundColorAttributeName), barvu pozadí (NSBackgroundColorAttributeName), podtržení (NSUnderlineStyleAttributeName), přeškrtnutí (NSStrikethroughStyleAttributeName), stín (NSShadowAttributeName). Odstavcové atributy se nastavují přes NSParagraphStyleAttributeName, který řídí zarovnání, odsazení, řádkování a tabelaci.

Atributy odkazů a interaktivity

NSLinkAttributeName vytváří klikatelný odkaz v textu: hodnota je URL nebo řetězec. UITextView automaticky zpracovává takové odkazy, pokud je zapnuta interakce. NSAttachmentAttributeName umožňuje vložit NSTextAttachment — obrázek uvnitř textu, který se zobrazuje jako inline prvek. Používá se k vytváření textů s ikonami, emoji nebo vlastními pohledy uvnitř řetězce.

Základní atributy stylizace

Každý atribut NSAttributedString má přísně typovanou hodnotu. Podívejme se na nejčastěji používané atributy ve vývoji pro iOS. Písmo se nastavuje objektem UIFont, barva pomocí UIColor, řádkování přes NSMutableParagraphStyle, který umožňuje konfigurovat zarovnání, odsazení a mezery v jednom objektu.

Klíč atributuTyp hodnotyÚčel
NSFontAttributeNameUIFontPísmo textu
NSForegroundColorAttributeNameUIColorBarva textu
NSBackgroundColorAttributeNameUIColorBarva pozadí pod textem
NSUnderlineStyleAttributeNameNSNumber (Int)Styl podtržení
NSParagraphStyleAttributeNameNSParagraphStyleNastavení odstavce
NSKernAttributeNameNSNumber (Float)Mezera mezi písmeny

NSParagraphStyle

NSParagraphStyle je kontejner pro atributy odstavce: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight a další. Pro změnu těchto parametrů se vytvoří NSMutableParagraphStyle, nastaví se požadované vlastnosti a objekt se předá jako hodnota atributu NSParagraphStyleAttributeName. Toto je jediný způsob řízení řádkování v NSAttributedString.

Stín a efekty

NSShadow umožňuje přidat stín k textu: parametry shadowOffset, shadowBlurRadius, shadowColor nastavují posun, rozmazání a barvu stínu. Atributy podtržení a přeškrtnutí přijímají kombinace stylů: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. Pro přesné řízení tloušťky a barvy čar se používají NSUnderlineColorAttributeName a NSStrikethroughColorAttributeName.

Jak používat NSAttributedString v kódu

Vytvoření NSAttributedString v Swift se provádí pomocí inicializátoru s uvedením textu a slovníku atributů, nebo pomocí NSMutableAttributedString s postupným aplikováním stylů. Základní přístup — definovat slovník atributů pro celý text, poté přidat nebo změnit atributy pro jednotlivé rozsahy.

Vytvoření s atributy pro celý text

Jednoduchý příklad — nastavení písma, barvy a zarovnání pro celý řetězec. Slovník atributů se předá inicializátoru NSAttributedString. Klíče slovníku jsou konstanty NSAttributedString.Key, hodnoty jsou odpovídající objekty UIKit. Toto je základní varianta, kdy je celý text formátován jednotně.

swift
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

Text se zobrazí písmem systemFont 16, tmavě šedou barvou, se zarovnáním na střed a řádkováním 4pt. Tento přístup je vhodný pro statické nadpisy a tlačítka.

Aplikace na rozsah

NSMutableAttributedString umožňuje aplikovat různé styly na různé části textu. Metoda addAttribute přidá jeden atribut k rozsahu, addAttributes — slovník atributů. Metoda setAttributes nahradí všechny atributy rozsahu novými. To je hlavní nástroj pro vytváření textu se zvýrazněním.

swift
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

Slovo „1999“ bude zelené a tučné, zbytek textu — standardní. NSRange se vypočítává ručně — důležité je správně počítat délku ve znacích, zejména při práci s emoji a složenými znaky Unicode.

Dynamické styly s NSMutableAttributedString

NSMutableAttributedString poskytuje metody pro dynamickou změnu textu a atributů: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. To umožňuje stavět text z různých zdrojů, kombinovat styly a reagovat na události rozhraní.

Na rozdíl od neměnného NSAttributedString, mutable verze podporuje změnu obsahu bez vytvoření nového objektu. To je klíčové pro textové editory, chaty a formuláře, kde uživatel může upravovat text a styly musí zůstat zachovány.

Kombinování stylů v chatu

V aplikacích pro zasílání zpráv každá zpráva obsahuje uživatelské jméno (tučné písmo), text zprávy (normální), čas (šedá barva). NSMutableAttributedString umožňuje sestavit takový řetězec najednou, přidáním částí ve správném pořadí s odpovídajícími atributy.

swift
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

Výsledek — jeden řetězec se třemi stylovými částmi. Append automaticky správně vypočítá NSRange, pozice není třeba počítat ručně. Tento přístup je škálovatelný na libovolný počet fragmentů.

Procházení atributů

Metoda enumerateAttributes(in:options:using:) prochází všechny rozsahy atributů v určeném intervalu. To je užitečné pro analýzu formátování: nalezení všech odkazů, změna barvy určitých atributů nebo export textu do HTML. V uzávěru se předávají slovník atributů a NSRange aktuální části.

Attributed Text v komponentech UIKit

Všechny základní UI komponenty pro zobrazení textu v UIKit podporují NSAttributedString pomocí vlastnosti attributedText. UILabel zobrazuje statický stylizovaný text, UITextView podporuje úpravy a odkazy, UITextField přijímá atributy zvlášť pro placeholder a zadaný text.

UILabel s attributedText

UILabel je nejlehčí komponenta pro zobrazení stylizovaného textu. Podporuje všechny znakové atributy, ale nezpracovává klikatelné odkazy automaticky (k tomu je potřeba UITextView). UILabel je ideální pro nadpisy, popisky a krátké texty s formátováním.

UITextView s odkazy

UITextView zpracovává NSLinkAttributeName a zobrazuje odkazy jako interaktivní prvky. Pro zapnutí této funkce nastavte isSelectable = true a isEditable = false. Při kliknutí na odkaz obdrží delegát volání textView(_:shouldInteractWith:in:interaction:). UITextView také podporuje NSTextAttachment pro obrázky uvnitř textu.

swift
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

Po nastavení isSelectable a isEditable se textová oblast chová jako statický blok textu, ale odkazy zůstávají aktivní. Delegát UITextViewDelegate řídí chování při kliknutí.

Integrace s Core Text

Core Text je nízkoúrovňový framework Apple pro vykreslování textu, který pracuje přímo s NSAttributedString. Na rozdíl od UIKit, Core Text nepoužívá NSAttributedString přímo jako zobrazovaný objekt, ale převádí jej na CTFramesetter, poté na CTFrame a vykresluje v kontextu Core Graphics. To poskytuje plnou kontrolu nad umístěním řádků a glyfů.

Použití Core Text je opodstatněné pro vlastní rozložení textu: sloupce, obtékání obrázků, rotace textu, nestandardní zalomení řádků. NSMutableParagraphStyle Core Text obsahuje atributy, které v UIKit nejsou: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode s dalšími režimy.

Konverze mezi UIKit a Core Text

NSAttributedString se bezproblémově přenáší mezi UIKit a Core Text, protože oba frameworky pracují se stejným typem. Atributy UIKit (NSFontAttributeName, NSForegroundColorAttributeName) jsou automaticky rozpoznány Core Text a naopak — atributy Core Text (kCTFontAttributeName) jsou čteny UIKit. To umožňuje používat UIKit pro jednoduché úkoly a Core Text pro vlastní vykreslování na stejném objektu NSAttributedString.

Často kladené dotazy

Čím se liší NSAttributedString od NSString?

NSString ukládá pouze text bez informací o stylu. NSAttributedString doplňuje text slovníkem atributů pro každý rozsah znaků. Při předání UILabel přes vlastnost text se NSString zobrazí jako prostý text. Při předání NSAttributedString přes vlastnost attributedText se aplikují všechny atributy: různá písma, barvy a mezery v jednom řetězci.

Jak přidat více atributů k jednomu rozsahu?

Použijte metodu addAttributes(_:range:) se slovníkem atributů: addAttributes([.font: font, .foregroundColor: color], range: range). Pro přidání nebo změnu jednoho atributu použijte addAttribute(_:value:range:). Metoda setAttributes nahrazuje všechny existující atributy v rozsahu novými.

Jak změnit řádkování v NSAttributedString?

Vytvořte NSMutableParagraphStyle, nastavte vlastnost lineSpacing, poté jej předejte jako hodnotu atributu NSParagraphStyleAttributeName. Pro plnou kontrolu jsou k dispozici také minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode a alignment. ParagraphStyle je jediný způsob řízení řádkování.

Fungují atributy ve SwiftUI?

Ano, SwiftUI podporuje NSAttributedString přes Text(attributedString:) v iOS 15+. Ve starších verzích použijte UIViewRepresentable s UILabel nebo UITextView. SwiftUI také poskytuje vlastní typ AttributedString (SwiftUI, ne Foundation) pro deklarativní formátování se syntaxí podobnou Markdown.

Jak vypočítat velikost NSAttributedString?

Použijte metodu boundingRect(with:options:context:), která vrací CGRect potřebný pro zobrazení řetězce s danými atributy. Parametr options: [.usesLineFragmentOrigin, .usesFontLeading] zohledňuje řádkování a metriky písma. Pro UILabel s omezeným počtem řádků použijte sizeThatFits.

Shrnutí

  • NSAttributedString — třída Foundation pro stylizaci textu pomocí slovníků atributů v iOS
  • Atributy zahrnují písmo (UIFont), barvu (UIColor), podtržení, stín a nastavení odstavce
  • NSMutableAttributedString — dynamická verze s přidáváním a odebíráním atributů
  • addAttributes(_:range:) aplikuje slovník atributů na rozsah znaků
  • NSParagraphStyle řídí řádkování, zarovnání a odsazení
  • UILabel, UITextView, UITextField podporují attributedText pro zobrazení stylů
  • Core Text používá stejný NSAttributedString pro nízkoúrovňové vykreslování

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také