Attributed Text : ce que c’est, types d’attributs et stylisation

Auteur : IT Sectr Publié le : 2026-07-23 Temps de lecture : 8 min

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 — une classe immuable pour styliser du texte via des dictionnaires d’attributs dans iOS
  • Les attributs incluent la police, la couleur, l’interligne, l’ombre, le soulignement et l’alignement
  • NSMutableAttributedString — une version mutable pour appliquer dynamiquement des styles
  • addAttributes applique un dictionnaire d’attributs à une plage, addAttribute applique un seul attribut
  • NSAttributedString est utilisé dans UILabel, UITextView, UITextField et Core Text

Qu’est-ce qu’Attributed Text dans iOS ?

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.

Différence avec NSString

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.

Format de stockage

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.

Attributs de NSAttributedString

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.

Attributs de lien et d’interactivité

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.

Attributs de base de la stylisation

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’attributType de valeurObjectif
NSFontAttributeNameUIFontPolice du texte
NSForegroundColorAttributeNameUIColorCouleur du texte
NSBackgroundColorAttributeNameUIColorCouleur d’arrière-plan derrière le texte
NSUnderlineStyleAttributeNameNSNumber (Int)Style de soulignement
NSParagraphStyleAttributeNameNSParagraphStyleParamètres de paragraphe
NSKernAttributeNameNSNumber (Float)Espacement entre les lettres (crénage)

NSParagraphStyle

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.

Ombre et effets

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.

Comment utiliser NSAttributedString dans le code

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.

Création avec des attributs pour tout le texte

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.

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

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.

Application à une plage

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.

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

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.

Styles dynamiques avec NSMutableAttributedString

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.

Combinaison de styles dans un chat

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.

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

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.

Énumération des attributs

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.

Attributed Text dans les composants d’interface UIKit

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 avec attributedText

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 avec liens

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.

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

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.

Intégration avec Core Text

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.

Conversion entre UIKit et Core Text

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

Quelle est la différence entre NSAttributedString et NSString ?

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.

Comment ajouter plusieurs attributs à une seule plage ?

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.

Comment modifier l’interligne dans NSAttributedString ?

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.

Les attributs fonctionnent-ils dans SwiftUI ?

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.

Comment calculer la taille de NSAttributedString ?

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é

  • NSAttributedString — une classe Foundation pour styliser du texte via des dictionnaires d’attributs dans iOS
  • Les attributs incluent la police (UIFont), la couleur (UIColor), le soulignement, l’ombre et les paramètres de paragraphe
  • NSMutableAttributedString — une version dynamique pour ajouter et supprimer des attributs
  • addAttributes(_:range:) applique un dictionnaire d’attributs à une plage de caractères
  • NSParagraphStyle contrôle l’interligne, l’alignement et le retrait
  • UILabel, UITextView, UITextField prennent en charge attributedText pour afficher les styles
  • Core Text utilise le même NSAttributedString pour le rendu bas niveau

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.

Discuter du projet

Lisez aussi