Points Clés
Dynamic Type est une technologie Apple qui permet aux polices d'une application de se mettre automatiquement à l'échelle lorsque la taille du texte système change. L'utilisateur définit sa taille préférée dans Réglages → Accessibilité → Affichage et Taille du Texte, et toutes les applications prenant en charge Dynamic Type adaptent la taille de la police sans redémarrage.
Le système propose 11 niveaux de mise à l'échelle : de XS (14pt de base) à XXXL (23pt de base), ainsi que 5 tailles d'accessibilité supplémentaires (AX1–AX5) pour les utilisateurs ayant des déficiences visuelles importantes. Lorsque la taille change, iOS génère une notification UIContentSizeCategory.didChangeNotification, et l'application doit recharger les polices via UIFontMetrics. Selon les Apple Human Interface Guidelines, Dynamic Type ne modifie ni l'interlignage ni les proportions des lettres — seulement la taille de la police, préservant ainsi la lisibilité à toutes les tailles.
Dynamic Type est obligatoire pour les applications visant le statut d'accessibilité. À la WWDC 2024, Apple a annoncé que les applications sans prise en charge du type dynamique risquent un refus lors de la révision si leur fonctionnalité principale implique la lecture de texte. Dans les projets IT Sectr, nous implémentons Dynamic Type dès la première version — cela permet d'économiser jusqu'à 20% de temps sur l'adaptation ultérieure à l'accessibilité.
Apple fournit 11 styles de texte prédéfinis, chacun rendu via UIFontDescriptor.UIAttributes pour la police système SF Pro. Le développeur ne spécifie pas de taille en pixels — il choisit un style sémantique, et iOS applique la taille de police réelle en fonction des paramètres de l'utilisateur.
| Style | Taille (par défaut) | Taille (AX5) | Utilisation |
|---|---|---|---|
| .largeTitle | 34pt | 62pt | Titres d'écran de premier niveau |
| .title1 | 28pt | 50pt | Titres secondaires |
| .title2 | 22pt | 40pt | Titres de section |
| .title3 | 20pt | 36pt | Sous-titres |
| .headline | 17pt semibold | 31pt | Texte en évidence dans les listes |
| .body | 17pt | 31pt | Corps du texte |
| .callout | 16pt | 29pt | Encadrés et texte complémentaire |
| .subheadline | 15pt | 27pt | Étiquettes d'éléments |
| .footnote | 13pt | 23pt | Notes de bas de page et petit texte |
| .caption1 | 12pt | 21pt | Légendes d'images |
| .caption2 | 11pt | 19pt | Étiquettes et petites légendes |
Chaque style utilise la police système SF Pro avec un graissage fixe (Regular pour body, Bold pour headline). Les polices personnalisées sont connectées via UIFontMetrics — la seule manière correcte d'adapter une police tierce au type dynamique.
UIFontMetrics est une classe introduite dans iOS 11 qui met à l'échelle un UIFont arbitraire proportionnellement au style de texte sélectionné. Avant iOS 11, les développeurs utilisaient un appel direct à preferredFontForTextStyle, qui ne renvoie que la police système SF Pro. UIFontMetrics résout ce problème : il prend n'importe quelle police et renvoie sa version mise à l'échelle, en préservant le graissage et les proportions.
La méthode scaledFont(for:) calcule un facteur d'échelle basé sur la taille de texte actuelle de l'utilisateur : si Grande est sélectionnée, le facteur est de 1,0 ; si Très Grande (AX1) — environ 1,3 ; pour Maximum (AX5) — jusqu'à 1,8. Le facteur est appliqué à la taille de base de la police personnalisée, pas à celle du système — cela garantit que l'intention du concepteur est préservée à toutes les tailles.
UIFontMetrics est recommandé pour toutes les polices personnalisées dans une application. À la WWDC 2024, Apple a présenté l'outil Accessibility Inspector, qui vérifie la prise en charge de Dynamic Type et met en évidence les éléments utilisant une taille de police fixe au lieu d'UIFontMetrics. Chez IT Sectr, nous avons implémenté UIFontMetrics dans tous les projets depuis 2018 — cela a réduit les bugs de chevauchement de texte de 35%.
La façon la plus simple d'obtenir une police dynamique pour un label. Le code montre comment définir un UILabel avec le style .body qui répond automatiquement aux changements de taille du texte système.
import UIKit
class GreetingViewController: UIViewController {
private let label: UILabel = {
let l = UILabel()
l.text = "Hello, Dynamic Type!"
l.font = UIFont.preferredFont(forTextStyle: .body)
l.adjustsFontForContentSizeCategory = true
l.translatesAutoresizingMaskIntoConstraints = false
return l
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor),
])
}
}
Le flag adjustsFontForContentSizeCategory = true met automatiquement à jour la police lorsque la taille du texte système change — sans ce flag, Dynamic Type ne fonctionnera pas pour un label existant. Lorsque la taille change, iOS appelle layoutIfNeeded, et le label met à jour la police sans intervention manuelle.
Lors de l'utilisation d'une police personnalisée (par exemple, Montserrat), l'appel à preferredFontForTextStyle renverra SF Pro, pas votre police. UIFontMetrics met spécifiquement à l'échelle la police personnalisée, en préservant son design.
import UIKit
extension UIFont {
static func customDynamicFont(name: String,
size: CGFloat,
style: UIFont.TextStyle) -> UIFont {
guard let baseFont = UIFont(name: name, size: size) else {
return .preferredFont(forTextStyle: style)
}
return UIFontMetrics(forTextStyle: style).scaledFont(for: baseFont)
}
}
let titleFont = UIFont.customDynamicFont(
name: "Montserrat-Bold",
size: 20,
style: .title3
)
La méthode scaledFont(for:) prend un UIFont de base et renvoie une version mise à l'échelle proportionnelle au style .title3. À la taille d'accessibilité AX5, la police Montserrat-Bold 20pt devient ~36pt — exactement autant qu'augmenterait la police système de ce style. Chez IT Sectr, nous utilisons ce modèle dans tous les projets avec des polices personnalisées depuis 2018, ce qui a complètement éliminé les plaintes concernant les petits textes de la part des utilisateurs ayant des déficiences visuelles.
Si vous mettez à jour la police manuellement (sans adjustsFontForContentSizeCategory), abonnez-vous à la notification UIContentSizeCategory.didChangeNotification. Cela est nécessaire pour les éléments d'interface personnalisés qui n'héritent pas de la mise à jour automatique de la police.
import UIKit
class DynamicLabel: UILabel {
private var customFont: UIFont?
private var textStyle: UIFont.TextStyle = .body
func configure(font: UIFont, style: UIFont.TextStyle) {
customFont = font
textStyle = style
NotificationCenter.default.addObserver(
self,
selector: #selector(updateFont),
name: UIContentSizeCategory.didChangeNotification,
object: nil
)
updateFont()
}
@objc private func updateFont() {
guard let base = customFont else { return }
self.font = UIFontMetrics(forTextStyle: textStyle).scaledFont(for: base)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
}
L'abonnement à didChangeNotification garantit que l'élément personnalisé met à jour sa police chaque fois que les paramètres système changent sans redémarrer l'application. Depuis iOS 15, la notification arrive même lorsque la taille du texte est modifiée via le Centre de contrôle dans les applications prenant en charge Live Text Size.
Foire Aux Questions
Dynamic Type est disponible sur iOS 7 et versions ultérieures. UIFontMetrics est apparu dans iOS 11 — avant cela, la méthode preferredFontForTextStyle était utilisée directement. Sous iOS 15+, le type dynamique prend en charge des tailles d'accessibilité supplémentaires (AX1–AX5) pour les grandes polices. Les applications prenant en charge iOS 10 et inférieur utilisent preferredFontForTextStyle sans UIFontMetrics, ce qui limite la prise en charge à la seule police système SF Pro.
Dans Xcode 15+, ouvrez le simulateur et allez dans Réglages → Accessibilité → Affichage et Taille du Texte → Texte plus grand. Faites glisser le curseur pour modifier la taille. Dans Xcode lui-même, il y a Debug → Accessibility Inspector, qui met en évidence les éléments avec une police fixe. Pour l'automatisation, utilisez un test qui modifie le UISlider des réglages via XCUITest — cela garantit que tous les écrans se reconstruisent correctement.
Oui, Auto Layout avec le type dynamique nécessite l'utilisation de intrinsicContentSize sur UILabel et UIButton. Aux tailles d'accessibilité, le texte peut dépasser les limites de la superview — ajoutez UIScrollView ou augmentez les contraintes leading/trailing. Utilisez UIFontMetrics.scaledValue pour le padding, afin que l'espacement des lettres soit également mis à l'échelle proportionnellement à la police.
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