Attributed Text è un meccanismo dell’iOS SDK, rappresentato dalle classi NSAttributedString e NSMutableAttributedString, che consente di applicare stili multipli a diverse parti di una stessa stringa di testo. A differenza di un normale NSString, Attributed String memorizza non solo i caratteri ma anche un dizionario di attributi per ogni intervallo: font, colore, interlinea, ombra e allineamento. Secondo la Documentazione per sviluppatori Apple, Attributed String è la base per visualizzare testo formattato in UILabel, UITextView e UITextField. È il modo standard per stilizzare il testo senza WebKit o librerie di terze parti.
Punti chiave
NSAttributedString è una classe del framework Foundation che rappresenta una stringa con un insieme di attributi nominati legati a intervalli di caratteri. Ogni attributo è una coppia chiave-valore: la chiave è definita da una costante (NSFontAttributeName, NSForegroundColorAttributeName) e il valore è l’oggetto corrispondente (UIFont, UIColor). Gli attributi vengono applicati a un intervallo di caratteri tramite NSRange.
La classe è disponibile su tutte le piattaforme Apple: iOS (2.0+), macOS, tvOS, watchOS. NSAttributedString è immutabile — una volta creato, i suoi attributi sono fissi. Per modifiche dinamiche si usa NSMutableAttributedString, che eredita da NSAttributedString e aggiunge i metodi setAttributes, addAttributes, addAttribute, removeAttribute.
NSString è una semplice stringa di caratteri senza informazioni di stile. Qualsiasi testo passato a UILabel tramite text viene visualizzato con un unico font, colore e dimensione. NSAttributedString, passato tramite attributedText, consente a ogni carattere di avere il proprio insieme di attributi. UILabel, UITextView e UITextField riconoscono automaticamente NSAttributedString e renderizzano il testo secondo i suoi attributi.
Internamente, NSAttributedString memorizza un NSString con il testo e un array di intervalli di attributi. Ogni intervallo è rappresentato da una struttura NSRange e un dizionario di attributi. Durante il rendering, il sistema scorre gli intervalli e applica gli attributi corrispondenti a ogni sezione. L’efficienza dipende dal numero di cambi di attributi — cambi frequenti su sezioni brevi aumentano il tempo di rendering.
Gli attributi di NSAttributedString sono costanti definite in UIKit (iOS) e AppKit (macOS), ciascuna corrispondente a un aspetto specifico della formattazione visiva del testo. Tutti gli attributi sono stringhe NSAttributedString.Key e i loro valori sono oggetti di classi specifiche. Gli attributi si dividono in livello carattere (influenzano i caratteri) e livello paragrafo (influenzano i paragrafi).
Gli attributi di livello carattere includono font (NSFontAttributeName), colore del testo (NSForegroundColorAttributeName), colore di sfondo (NSBackgroundColorAttributeName), sottolineatura (NSUnderlineStyleAttributeName), barrato (NSStrikethroughStyleAttributeName), ombra (NSShadowAttributeName). Gli attributi di livello paragrafo sono impostati tramite NSParagraphStyleAttributeName, che controlla allineamento, rientro, interlinea e tabulazione.
NSLinkAttributeName crea un link cliccabile nel testo: il valore è un URL o una stringa. UITextView gestisce automaticamente questi link se l’interazione è abilitata. NSAttachmentAttributeName consente di incorporare un NSTextAttachment — un’immagine all’interno del testo che viene visualizzata come elemento inline. Questo viene usato per creare testo con icone, emoji o viste personalizzate all’interno di una stringa.
Ogni attributo di NSAttributedString ha un valore rigorosamente tipizzato. Esaminiamo gli attributi più comunemente usati nello sviluppo iOS. Il font viene impostato tramite un oggetto UIFont, il colore tramite UIColor, l’interlinea tramite NSMutableParagraphStyle, che consente di configurare allineamento, rientro e spaziatura in un unico oggetto.
| Chiave attributo | Tipo valore | Scopo |
|---|---|---|
| NSFontAttributeName | UIFont | Font del testo |
| NSForegroundColorAttributeName | UIColor | Colore del testo |
| NSBackgroundColorAttributeName | UIColor | Colore di sfondo dietro il testo |
| NSUnderlineStyleAttributeName | NSNumber (Int) | Stile di sottolineatura |
| NSParagraphStyleAttributeName | NSParagraphStyle | Impostazioni paragrafo |
| NSKernAttributeName | NSNumber (Float) | Spaziatura tra lettere (kerning) |
NSParagraphStyle è un contenitore per gli attributi di paragrafo: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight e altri. Per modificare questi parametri, si crea un NSMutableParagraphStyle, si impostano le proprietà desiderate e l’oggetto viene passato come valore dell’attributo NSParagraphStyleAttributeName. Questo è l’unico modo per controllare l’interlinea in NSAttributedString.
NSShadow consente di aggiungere un’ombra al testo: i parametri shadowOffset, shadowBlurRadius, shadowColor impostano offset, sfocatura e colore dell’ombra. Gli attributi di sottolineatura e barrato accettano combinazioni di stili: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. Per un controllo preciso dello spessore e del colore delle linee, si usano NSUnderlineColorAttributeName e NSStrikethroughColorAttributeName.
La creazione di un NSAttributedString in Swift avviene tramite un inizializzatore con il testo e un dizionario di attributi, o tramite NSMutableAttributedString con applicazione passo passo degli stili. L’approccio di base è definire un dizionario di attributi per l’intero testo, quindi aggiungere o modificare attributi per intervalli specifici.
Un esempio semplice — impostare font, colore e allineamento per l’intera stringa. Il dizionario di attributi viene passato all’inizializzatore di NSAttributedString. Le chiavi del dizionario sono costanti NSAttributedString.Key, i valori sono oggetti UIKit corrispondenti. Questo è il caso base quando l’intero testo viene formattato uniformemente.
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
Il testo verrà visualizzato con systemFont 16, colore grigio scuro, allineamento centrato e interlinea di 4pt. Questo approccio è comodo per intestazioni e pulsanti statici.
NSMutableAttributedString consente di applicare stili diversi a parti diverse del testo. Il metodo addAttribute aggiunge un singolo attributo a un intervallo, addAttributes aggiunge un dizionario di attributi. Il metodo setAttributes sostituisce tutti gli attributi esistenti di un intervallo con nuovi attributi. Questo è lo strumento principale per creare testo con evidenziazioni.
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
La parola “1999” sarà verde e in grassetto, il resto del testo sarà standard. NSRange viene calcolato manualmente — è importante contare correttamente la lunghezza in caratteri, specialmente quando si lavora con emoji e caratteri Unicode composti.
NSMutableAttributedString fornisce metodi per modificare dinamicamente testo e attributi: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. Ciò consente di costruire testo da fonti diverse, combinare stili e rispondere agli eventi dell’interfaccia.
A differenza dell’immutabile NSAttributedString, la versione mutabile supporta la modifica del contenuto senza creare un nuovo oggetto. Questo è fondamentale per editor di testo, chat e moduli dove l’utente può modificare il testo mentre gli stili devono essere preservati.
Nei messenger, ogni messaggio contiene il nome utente (grassetto), il testo del messaggio (normale), l’ora (colore grigio). NSMutableAttributedString consente di costruire tale stringa in una volta sola aggiungendo le parti nell’ordine desiderato con gli attributi corrispondenti.
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
Il risultato è un’unica stringa con tre sezioni stilizzate. Append calcola NSRange automaticamente, le posizioni non devono essere calcolate manualmente. Questo approccio si adatta a qualsiasi numero di frammenti.
Il metodo enumerateAttributes(in:options:using:) scorre tutti gli intervalli di attributi nell’intervallo specificato. Questo è utile per l’analisi della formattazione: trovare tutti i link, cambiare il colore di attributi specifici o esportare testo in HTML. Alla chiusura vengono passati il dizionario degli attributi e l’NSRange della sezione corrente.
Tutti i principali componenti UI per visualizzare testo in UIKit supportano NSAttributedString tramite la proprietà attributedText. UILabel visualizza testo stilizzato statico, UITextView supporta modifica e link, UITextField accetta attributi separatamente per il placeholder e il testo inserito.
UILabel è il componente più leggero per visualizzare testo stilizzato. Supporta tutti gli attributi di livello carattere ma non gestisce automaticamente i link cliccabili (per questo serve UITextView). UILabel è ideale per intestazioni, etichette e testi formattati brevi.
UITextView gestisce NSLinkAttributeName e visualizza i link come elementi interattivi. Per abilitare questa funzionalità, impostare isSelectable = true e isEditable = false. Quando si tocca un link, il delegato riceve la chiamata textView(_:shouldInteractWith:in:interaction:). UITextView supporta anche NSTextAttachment per immagini all’interno del testo.
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
Dopo aver impostato isSelectable e isEditable, l’area di testo si comporta come un blocco di testo statico, ma i link rimangono attivi. UITextViewDelegate controlla il comportamento al tocco.
Core Text è un framework di basso livello di Apple per il rendering del testo che lavora direttamente con NSAttributedString. A differenza di UIKit, Core Text non usa NSAttributedString direttamente come oggetto di visualizzazione — invece lo converte in CTFramesetter, poi CTFrame e lo renderizza in un contesto Core Graphics. Questo dà il controllo completo sul layout delle righe e dei glifi.
L’uso di Core Text è giustificato per layout di testo personalizzati: colonne, wrapping di immagini, rotazione del testo, interruzioni di riga non standard. NSMutableParagraphStyle di Core Text include attributi non disponibili in UIKit: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode con modalità aggiuntive.
NSAttributedString si trasferisce senza problemi tra UIKit e Core Text, poiché entrambi i framework lavorano con lo stesso tipo. Gli attributi UIKit (NSFontAttributeName, NSForegroundColorAttributeName) sono automaticamente riconosciuti da Core Text e viceversa — gli attributi Core Text (kCTFontAttributeName) sono letti da UIKit. Ciò consente di usare UIKit per attività semplici e Core Text per il rendering personalizzato sullo stesso oggetto NSAttributedString.
Domande frequenti
NSString memorizza solo testo senza informazioni di stile. NSAttributedString arricchisce il testo con un dizionario di attributi per ogni intervallo di caratteri. Quando viene passato a UILabel tramite la proprietà text, NSString viene visualizzato come testo semplice. Quando NSAttributedString viene passato tramite attributedText, vengono applicati tutti gli attributi: font diversi, colori e spaziature in un’unica stringa.
Usa il metodo addAttributes(_:range:) con un dizionario di attributi: addAttributes([.font: font, .foregroundColor: color], range: range). Per aggiungere o modificare un singolo attributo, usa addAttribute(_:value:range:). Il metodo setAttributes sostituisce tutti gli attributi esistenti nell’intervallo con quelli forniti.
Crea un NSMutableParagraphStyle, imposta la proprietà lineSpacing, quindi passalo come valore dell’attributo NSParagraphStyleAttributeName. Per il controllo completo, sono disponibili anche minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode e alignment. ParagraphStyle è l’unico modo per controllare l’interlinea.
Sì, SwiftUI supporta NSAttributedString tramite Text(attributedString:) in iOS 15+. Nelle versioni precedenti, usa UIViewRepresentable con UILabel o UITextView. SwiftUI fornisce anche il proprio tipo AttributedString (SwiftUI, non Foundation) per la formattazione dichiarativa con sintassi simile al Markdown.
Usa il metodo boundingRect(with:options:context:), che restituisce il CGRect necessario per visualizzare la stringa con gli attributi specificati. Il parametro options: [.usesLineFragmentOrigin, .usesFontLeading] tiene conto dell’interlinea e delle metriche del font. Per UILabel con un numero limitato di righe, usa sizeThatFits.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche