Attributed Text est un mécanisme du SDK iOS, représenté par les classes NSAttributedString et NSMutableAttributedString, qui permet d’appliquer plusieurs styles à différentes parties d’une même chaîne de texte. Contrairement à un NSString classique, Attributed String stocke non seulement les caractères, mais aussi un dictionnaire d’attributs pour chaque plage : police, couleur, interligne, ombre et alignement. Selon la Documentation Apple pour les développeurs, Attributed String est la base pour afficher du texte formaté dans UILabel, UITextView et UITextField. C’est la façon standard de styliser du texte sans WebKit ni bibliothèques tierces.
Points clés
NSAttributedString est une classe du framework Foundation qui représente une chaîne avec un ensemble d’attributs nommés liés à des plages de caractères. Chaque attribut est une paire clé-valeur : la clé est définie par une constante (NSFontAttributeName, NSForegroundColorAttributeName) et la valeur est l’objet correspondant (UIFont, UIColor). Les attributs sont appliqués à une plage de caractères via NSRange.
La classe est disponible sur toutes les plates-formes Apple : iOS (2.0+), macOS, tvOS, watchOS. NSAttributedString est immuable — une fois créé, ses attributs sont fixes. Pour les modifications dynamiques, on utilise NSMutableAttributedString, qui hérite de NSAttributedString et ajoute les méthodes setAttributes, addAttributes, addAttribute, removeAttribute.
NSString est une simple chaîne de caractères sans information de style. Tout texte passé à UILabel via text s’affiche avec une seule police, couleur et taille. NSAttributedString, passé via attributedText, permet à chaque caractère d’avoir son propre ensemble d’attributs. UILabel, UITextView et UITextField reconnaissent automatiquement NSAttributedString et restituent le texte selon ses attributs.
En interne, NSAttributedString stocke un NSString avec le texte et un tableau de plages d’attributs. Chaque plage est représentée par une structure NSRange et un dictionnaire d’attributs. Lors du rendu, le système parcourt les plages et applique les attributs correspondants à chaque section. L’efficacité dépend du nombre de changements d’attributs — des changements fréquents sur de courtes sections augmentent le temps de rendu.
Les attributs de NSAttributedString sont des constantes définies dans UIKit (iOS) et AppKit (macOS), chacune correspondant à un aspect spécifique de la mise en forme visuelle du texte. Tous les attributs sont des chaînes NSAttributedString.Key, et leurs valeurs sont des objets de classes spécifiques. Les attributs sont divisés en niveau caractère (affectent les caractères) et niveau paragraphe (affectent les paragraphes).
Les attributs de niveau caractère incluent la police (NSFontAttributeName), la couleur du texte (NSForegroundColorAttributeName), la couleur d’arrière-plan (NSBackgroundColorAttributeName), le soulignement (NSUnderlineStyleAttributeName), le barré (NSStrikethroughStyleAttributeName), l’ombre (NSShadowAttributeName). Les attributs de niveau paragraphe sont définis via NSParagraphStyleAttributeName, qui contrôle l’alignement, le retrait, l’interligne et la tabulation.
NSLinkAttributeName crée un lien cliquable dans le texte : la valeur est une URL ou une chaîne. UITextView gère automatiquement ces liens si l’interaction est activée. NSAttachmentAttributeName permet d’intégrer un NSTextAttachment — une image dans le texte qui s’affiche comme un élément en ligne. Cela est utilisé pour créer du texte avec des icônes, des émojis ou des vues personnalisées dans une chaîne.
Chaque attribut de NSAttributedString a une valeur strictement typée. Examinons les attributs les plus couramment utilisés dans le développement iOS. La police est définie via un objet UIFont, la couleur via UIColor, l’interligne via NSMutableParagraphStyle, qui permet de configurer l’alignement, le retrait et l’espacement dans un seul objet.
| Clé d’attribut | Type de valeur | Objectif |
|---|---|---|
| NSFontAttributeName | UIFont | Police du texte |
| NSForegroundColorAttributeName | UIColor | Couleur du texte |
| NSBackgroundColorAttributeName | UIColor | Couleur d’arrière-plan derrière le texte |
| NSUnderlineStyleAttributeName | NSNumber (Int) | Style de soulignement |
| NSParagraphStyleAttributeName | NSParagraphStyle | Paramètres de paragraphe |
| NSKernAttributeName | NSNumber (Float) | Espacement entre les lettres (crénage) |
NSParagraphStyle est un conteneur pour les attributs de paragraphe : alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight, etc. Pour modifier ces paramètres, on crée un NSMutableParagraphStyle, on définit les propriétés souhaitées, et l’objet est passé comme valeur de l’attribut NSParagraphStyleAttributeName. C’est la seule façon de contrôler l’interligne dans NSAttributedString.
NSShadow permet d’ajouter une ombre au texte : les paramètres shadowOffset, shadowBlurRadius, shadowColor définissent le décalage, le flou et la couleur de l’ombre. Les attributs de soulignement et de barré acceptent des combinaisons de styles : NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot. Pour un contrôle précis de l’épaisseur et de la couleur des lignes, on utilise NSUnderlineColorAttributeName et NSStrikethroughColorAttributeName.
La création d’un NSAttributedString en Swift se fait via un initialiseur avec le texte et un dictionnaire d’attributs, ou via NSMutableAttributedString avec une application étape par étape des styles. L’approche de base consiste à définir un dictionnaire d’attributs pour tout le texte, puis à ajouter ou modifier les attributs pour des plages spécifiques.
Un exemple simple — définir la police, la couleur et l’alignement pour toute la chaîne. Le dictionnaire d’attributs est passé à l’initialiseur de NSAttributedString. Les clés du dictionnaire sont des constantes NSAttributedString.Key, les valeurs sont des objets UIKit correspondants. C’est le cas de base lorsque tout le texte est formaté de manière uniforme.
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
Le texte s’affichera avec la systemFont 16, une couleur gris foncé, un alignement centré et un interligne de 4pt. Cette approche est pratique pour les en-têtes et les boutons statiques.
NSMutableAttributedString permet d’appliquer différents styles à différentes parties du texte. La méthode addAttribute ajoute un seul attribut à une plage, addAttributes ajoute un dictionnaire d’attributs. La méthode setAttributes remplace tous les attributs existants d’une plage par de nouveaux. C’est l’outil principal pour créer du texte avec des surlignages.
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
Le mot « 1999 » sera vert et en gras, le reste du texte sera standard. NSRange est calculé manuellement — il est important de compter correctement la longueur en caractères, surtout lorsqu’on travaille avec des émojis et des caractères Unicode composés.
NSMutableAttributedString fournit des méthodes pour modifier dynamiquement le texte et les attributs : append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes. Cela permet de construire du texte à partir de différentes sources, de combiner des styles et de répondre aux événements de l’interface.
Contrairement à NSAttributedString immuable, la version mutable prend en charge la modification du contenu sans créer un nouvel objet. C’est crucial pour les éditeurs de texte, les chats et les formulaires où l’utilisateur peut éditer le texte tandis que les styles doivent être préservés.
Dans les messageries, chaque message contient le nom d’utilisateur (gras), le texte du message (normal), l’heure (gris). NSMutableAttributedString permet de construire une telle chaîne en une seule fois en ajoutant les parties dans l’ordre souhaité avec les attributs correspondants.
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
Le résultat est une seule chaîne avec trois sections stylisées. Append calcule NSRange automatiquement, les positions n’ont pas besoin d’être calculées manuellement. Cette approche s’adapte à n’importe quel nombre de fragments.
La méthode enumerateAttributes(in:options:using:) parcourt toutes les plages d’attributs dans l’intervalle spécifié. C’est utile pour l’analyse de la mise en forme : trouver tous les liens, changer la couleur d’attributs spécifiques ou exporter du texte en HTML. La fermeture reçoit le dictionnaire d’attributs et le NSRange de la section actuelle.
Tous les principaux composants d’interface pour afficher du texte dans UIKit prennent en charge NSAttributedString via la propriété attributedText. UILabel affiche du texte stylisé statique, UITextView prend en charge l’édition et les liens, UITextField accepte les attributs pour le placeholder et le texte saisi séparément.
UILabel est le composant le plus léger pour afficher du texte stylisé. Il prend en charge tous les attributs de niveau caractère mais ne gère pas automatiquement les liens cliquables (pour cela, UITextView est nécessaire). UILabel est idéal pour les en-têtes, les étiquettes et les textes courts formatés.
UITextView gère NSLinkAttributeName et affiche les liens comme des éléments interactifs. Pour activer cette fonctionnalité, définissez isSelectable = true et isEditable = false. Lorsqu’un lien est touché, le délégué reçoit l’appel textView(_:shouldInteractWith:in:interaction:). UITextView prend également en charge NSTextAttachment pour les images dans le texte.
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
Après avoir défini isSelectable et isEditable, la zone de texte se comporte comme un bloc de texte statique, mais les liens restent actifs. UITextViewDelegate contrôle le comportement lors du toucher.
Core Text est un framework de bas niveau d’Apple pour le rendu de texte qui travaille directement avec NSAttributedString. Contrairement à UIKit, Core Text n’utilise pas NSAttributedString directement comme objet d’affichage — il le convertit en CTFramesetter, puis en CTFrame, et le restitue dans un contexte Core Graphics. Cela donne un contrôle total sur la disposition des lignes et des glyphes.
L’utilisation de Core Text est justifiée pour les mises en page de texte personnalisées : colonnes, habillage d’images, rotation de texte, sauts de ligne non standard. Le NSMutableParagraphStyle de Core Text inclut des attributs non disponibles dans UIKit : kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode avec des modes supplémentaires.
NSAttributedString se transfère de manière transparente entre UIKit et Core Text, car les deux frameworks travaillent avec le même type. Les attributs UIKit (NSFontAttributeName, NSForegroundColorAttributeName) sont automatiquement reconnus par Core Text, et inversement — les attributs Core Text (kCTFontAttributeName) sont lus par UIKit. Cela permet d’utiliser UIKit pour les tâches simples et Core Text pour le rendu personnalisé sur le même objet NSAttributedString.
Foire aux questions
NSString stocke uniquement le texte sans information de style. NSAttributedString complète le texte avec un dictionnaire d’attributs pour chaque plage de caractères. Lorsqu’il est passé à UILabel via la propriété text, NSString s’affiche en texte brut. Lorsque NSAttributedString est passé via attributedText, tous les attributs sont appliqués : différentes polices, couleurs et espacements dans une seule chaîne.
Utilisez la méthode addAttributes(_:range:) avec un dictionnaire d’attributs : addAttributes([.font: font, .foregroundColor: color], range: range). Pour ajouter ou modifier un seul attribut, utilisez addAttribute(_:value:range:). La méthode setAttributes remplace tous les attributs existants dans la plage par ceux fournis.
Créez un NSMutableParagraphStyle, définissez la propriété lineSpacing, puis passez-le comme valeur de l’attribut NSParagraphStyleAttributeName. Pour un contrôle total, minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode et alignment sont également disponibles. ParagraphStyle est la seule façon de contrôler l’interligne.
Oui, SwiftUI prend en charge NSAttributedString via Text(attributedString:) dans iOS 15+. Dans les versions antérieures, utilisez UIViewRepresentable avec UILabel ou UITextView. SwiftUI fournit également son propre type AttributedString (SwiftUI, pas Foundation) pour le formatage déclaratif avec une syntaxe de type Markdown.
Utilisez la méthode boundingRect(with:options:context:), qui retourne le CGRect nécessaire pour afficher la chaîne avec les attributs donnés. Le paramètre options : [.usesLineFragmentOrigin, .usesFontLeading] prend en compte l’interligne et les métriques de police. Pour UILabel avec un nombre limité de lignes, utilisez sizeThatFits.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi