Puntos Clave
Dynamic Type es una tecnología de Apple que permite que las fuentes de la aplicación se escalen automáticamente cuando cambia el tamaño del texto del sistema. El usuario establece su tamaño preferido en Configuración → Accesibilidad → Pantalla y Tamaño de Texto, y todas las aplicaciones compatibles con Dynamic Type adaptan el tamaño de la fuente sin necesidad de reiniciar.
El sistema ofrece 11 niveles de escalado: desde XS (14pt base) hasta XXXL (23pt base), además de 5 tamaños adicionales de accesibilidad (AX1–AX5) para usuarios con discapacidades visuales significativas. Al cambiar el tamaño, iOS genera una notificación UIContentSizeCategory.didChangeNotification, y la aplicación debe recargar las fuentes mediante UIFontMetrics. Según las Apple Human Interface Guidelines, Dynamic Type no cambia el interlineado ni las proporciones de las letras — solo el tamaño, preservando la legibilidad en todos los tamaños.
Dynamic Type es obligatorio para las aplicaciones que aspiran al estado de accesibilidad. En la WWDC 2024, Apple anunció que las aplicaciones sin soporte de tipo dinámico corren el riesgo de ser rechazadas en la revisión si su funcionalidad principal implica la lectura de texto. En los proyectos de IT Sectr, implementamos Dynamic Type desde la primera versión — esto ahorra hasta un 20% de tiempo en la adaptación posterior de accesibilidad.
Apple proporciona 11 estilos de texto predefinidos, cada uno representado mediante UIFontDescriptor.UIAttributes para la fuente del sistema SF Pro. El desarrollador no especifica un tamaño en píxeles — elige un estilo semántico, e iOS aplica el tamaño de fuente real según la configuración del usuario.
| Estilo | Tamaño (predet.) | Tamaño (AX5) | Uso |
|---|---|---|---|
| .largeTitle | 34pt | 62pt | Títulos de pantalla de primer nivel |
| .title1 | 28pt | 50pt | Encabezados secundarios |
| .title2 | 22pt | 40pt | Encabezados de sección |
| .title3 | 20pt | 36pt | Subencabezados |
| .headline | 17pt semibold | 31pt | Texto destacado en listas |
| .body | 17pt | 31pt | Texto del cuerpo |
| .callout | 16pt | 29pt | Llamadas y texto complementario |
| .subheadline | 15pt | 27pt | Etiquetas de elementos |
| .footnote | 13pt | 23pt | Notas al pie y texto pequeño |
| .caption1 | 12pt | 21pt | Títulos de imágenes |
| .caption2 | 11pt | 19pt | Etiquetas y títulos pequeños |
Cada estilo usa la fuente del sistema SF Pro con un grosor fijo (Regular para body, Bold para headline). Las fuentes personalizadas se conectan mediante UIFontMetrics — la única forma correcta de adaptar una fuente de terceros al tipo dinámico.
UIFontMetrics es una clase introducida en iOS 11 que escala un UIFont arbitrario proporcionalmente al estilo de texto seleccionado. Antes de iOS 11, los desarrolladores usaban una llamada directa a preferredFontForTextStyle, que solo devuelve la fuente del sistema SF Pro. UIFontMetrics resuelve este problema: toma cualquier fuente y devuelve su versión escalada, conservando el grosor y las proporciones.
El método scaledFont(for:) calcula un factor de escalado basado en el tamaño de texto actual del usuario: si se selecciona Grande, el factor es 1.0; si es Muy Grande (AX1) — aproximadamente 1.3; para Máximo (AX5) — hasta 1.8. El factor se aplica al tamaño base de la fuente personalizada, no al del sistema — esto garantiza que la intención del diseñador se conserve en todos los tamaños.
Se recomienda UIFontMetrics para todas las fuentes personalizadas en una aplicación. En la WWDC 2024, Apple mostró la herramienta Accessibility Inspector, que verifica la compatibilidad con Dynamic Type y resalta los elementos que usan un tamaño de fuente fijo en lugar de UIFontMetrics. En IT Sectr, hemos implementado UIFontMetrics en todos los proyectos desde 2018 — esto redujo los errores de superposición de texto en un 35%.
La forma más sencilla de obtener una fuente dinámica para una etiqueta. El código muestra cómo establecer un UILabel con el estilo .body que responde automáticamente a los cambios en el tamaño de texto del sistema.
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),
])
}
}
El indicador adjustsFontForContentSizeCategory = true actualiza automáticamente la fuente cuando cambia el tamaño de texto del sistema — sin este indicador, Dynamic Type no funcionará para una etiqueta existente. Cuando cambia el tamaño, iOS llama a layoutIfNeeded y la etiqueta actualiza la fuente sin intervención manual.
Al usar una fuente personalizada (por ejemplo, Montserrat), llamar a preferredFontForTextStyle devolverá SF Pro, no su fuente. UIFontMetrics escala específicamente la fuente personalizada, conservando su diseño.
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
)
El método scaledFont(for:) toma un UIFont base y devuelve una versión escalada proporcional al estilo .title3. En el tamaño de accesibilidad AX5, la fuente Montserrat-Bold 20pt se convierte en ~36pt — exactamente lo mismo que aumentaría la fuente del sistema de este estilo. En IT Sectr, hemos usado este patrón en todos los proyectos con fuentes personalizadas desde 2018, lo que eliminó por completo las quejas sobre texto pequeño de usuarios con discapacidades visuales.
Si actualiza la fuente manualmente (sin adjustsFontForContentSizeCategory), suscríbase a la notificación UIContentSizeCategory.didChangeNotification. Esto es necesario para elementos de interfaz personalizados que no heredan la actualización automática de fuentes.
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)
}
}
La suscripción a didChangeNotification garantiza que el elemento personalizado actualice su fuente cada vez que cambie la configuración del sistema sin reiniciar la aplicación. Desde iOS 15, la notificación llega incluso cuando se cambia el tamaño del texto a través del Centro de Control en aplicaciones compatibles con Live Text Size.
Preguntas Frecuentes
Dynamic Type está disponible en iOS 7 y versiones posteriores. UIFontMetrics apareció en iOS 11 — antes se usaba directamente el método preferredFontForTextStyle. En iOS 15+, el tipo dinámico admite tamaños de accesibilidad adicionales (AX1–AX5) para fuentes grandes. Las aplicaciones que admiten iOS 10 y versiones inferiores usan preferredFontForTextStyle sin UIFontMetrics, lo que limita la compatibilidad solo a la fuente del sistema SF Pro.
En Xcode 15+, abra el simulador y vaya a Configuración → Accesibilidad → Pantalla y Tamaño de Texto → Texto Más Grande. Arrastre el control deslizante para cambiar el tamaño. En el propio Xcode, hay Debug → Accessibility Inspector, que resalta los elementos con fuentes fijas. Para automatización, use una prueba que cambie el UISlider de configuración mediante XCUITest — esto garantiza que todas las pantallas se reconstruyan correctamente.
Sí, Auto Layout con tipo dinámico requiere usar intrinsicContentSize en UILabel y UIButton. En tamaños de accesibilidad, el texto puede desbordar los límites de la superview — agregue UIScrollView o aumente las restricciones leading/trailing. Use UIFontMetrics.scaledValue para el padding, de modo que el espaciado entre letras también se escale proporcionalmente a la fuente.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también