Principais Pontos
Dynamic Type é uma tecnologia da Apple que permite que as fontes do aplicativo sejam dimensionadas automaticamente quando o tamanho do texto do sistema é alterado. O usuário define seu tamanho preferido em Ajustes → Acessibilidade → Tela e Tamanho do Texto, e todos os aplicativos que suportam Dynamic Type adaptam o tamanho da fonte sem reinicialização.
O sistema oferece 11 níveis de dimensionamento: de XS (14pt base) a XXXL (23pt base), além de 5 tamanhos adicionais de acessibilidade (AX1–AX5) para usuários com deficiências visuais significativas. Quando o tamanho muda, o iOS gera uma notificação UIContentSizeCategory.didChangeNotification, e o aplicativo deve recarregar as fontes através do UIFontMetrics. De acordo com as Apple Human Interface Guidelines, o Dynamic Type não altera o espaçamento entre linhas nem as proporções das letras — apenas o tamanho da fonte, preservando a legibilidade em todos os tamanhos.
Dynamic Type é obrigatório para aplicativos que almejam o status de acessibilidade. Na WWDC 2024, a Apple anunciou que aplicativos sem suporte a tipo dinâmico correm o risco de rejeição durante a revisão se sua funcionalidade principal envolver leitura de texto. Nos projetos da IT Sectr, implementamos Dynamic Type desde a primeira versão — isso economiza até 20% do tempo na adaptação posterior de acessibilidade.
A Apple fornece 11 estilos de texto predefinidos, cada um renderizado através de UIFontDescriptor.UIAttributes para a fonte do sistema SF Pro. O desenvolvedor não especifica um tamanho em pixels — ele escolhe um estilo semântico, e o iOS aplica o tamanho real da fonte com base nas configurações do usuário.
| Estilo | Tamanho (padrão) | Tamanho (AX5) | Uso |
|---|---|---|---|
| .largeTitle | 34pt | 62pt | Títulos de tela de primeiro nível |
| .title1 | 28pt | 50pt | Heading secundários |
| .title2 | 22pt | 40pt | Títulos de seção |
| .title3 | 20pt | 36pt | Subtítulos |
| .headline | 17pt semibold | 31pt | Texto destacado em listas |
| .body | 17pt | 31pt | Texto do corpo |
| .callout | 16pt | 29pt | Callouts e texto complementar |
| .subheadline | 15pt | 27pt | Etiquetas de elementos |
| .footnote | 13pt | 23pt | Notas de rodapé e texto pequeno |
| .caption1 | 12pt | 21pt | Legendas de imagens |
| .caption2 | 11pt | 19pt | Etiquetas e legendas pequenas |
Cada estilo usa a fonte do sistema SF Pro com um peso fixo (Regular para body, Bold para headline). Fontes personalizadas são conectadas através do UIFontMetrics — a única maneira correta de adaptar uma fonte de terceiros ao tipo dinâmico.
UIFontMetrics é uma classe introduzida no iOS 11 que dimensiona um UIFont arbitrário proporcionalmente ao estilo de texto selecionado. Antes do iOS 11, os desenvolvedores usavam uma chamada direta ao preferredFontForTextStyle, que retorna apenas a fonte do sistema SF Pro. O UIFontMetrics resolve este problema: ele pega qualquer fonte e retorna sua versão dimensionada, preservando o peso e as proporções.
O método scaledFont(for:) calcula um fator de dimensionamento com base no tamanho de texto atual do usuário: se Grande for selecionado, o fator é 1.0; se Muito Grande (AX1) — aproximadamente 1.3; para Máximo (AX5) — até 1.8. O fator é aplicado ao tamanho base da fonte personalizada, não ao do sistema — isso garante que a intenção do designer seja preservada em todos os tamanhos.
UIFontMetrics é recomendado para todas as fontes personalizadas em um aplicativo. Na WWDC 2024, a Apple mostrou a ferramenta Accessibility Inspector, que verifica o suporte a Dynamic Type e destaca elementos que usam tamanho de fonte fixo em vez de UIFontMetrics. Na IT Sectr, implementamos UIFontMetrics em todos os projetos desde 2018 — isso reduziu os bugs de sobreposição de texto em 35%.
A maneira mais simples de obter uma fonte dinâmica para um label. O código mostra como definir um UILabel com o estilo .body que responde automaticamente a alterações no tamanho do texto do 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),
])
}
}
A flag adjustsFontForContentSizeCategory = true atualiza automaticamente a fonte quando o tamanho do texto do sistema muda — sem essa flag, o Dynamic Type não funcionará para um label existente. Quando o tamanho muda, o iOS chama layoutIfNeeded, e o label atualiza a fonte sem intervenção manual.
Ao usar uma fonte personalizada (por exemplo, Montserrat), chamar preferredFontForTextStyle retornará SF Pro, não sua fonte. O UIFontMetrics dimensiona especificamente a fonte personalizada, preservando seu 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
)
O método scaledFont(for:) pega um UIFont base e retorna uma versão dimensionada proporcional ao estilo .title3. No tamanho de acessibilidade AX5, a fonte Montserrat-Bold 20pt se torna ~36pt — exatamente o quanto a fonte do sistema deste estilo aumentaria. Na IT Sectr, usamos este padrão em todos os projetos com fontes personalizadas desde 2018, o que eliminou completamente as reclamações sobre texto pequeno de usuários com deficiências visuais.
Se você atualizar a fonte manualmente (sem adjustsFontForContentSizeCategory), assine a notificação UIContentSizeCategory.didChangeNotification. Isso é necessário para elementos de UI personalizados que não herdam a atualização automática de fonte.
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)
}
}
Assinar o didChangeNotification garante que o elemento personalizado atualize sua fonte sempre que as configurações do sistema mudarem sem reiniciar o aplicativo. Desde o iOS 15, a notificação chega mesmo quando o tamanho do texto é alterado através da Central de Controle em aplicativos que suportam Live Text Size.
Perguntas Frequentes
Dynamic Type está disponível no iOS 7 e versões posteriores. O UIFontMetrics apareceu no iOS 11 — antes disso, o método preferredFontForTextStyle era usado diretamente. No iOS 15+, o tipo dinâmico suporta tamanhos de acessibilidade adicionais (AX1–AX5) para fontes grandes. Aplicativos que suportam iOS 10 e inferior usam preferredFontForTextStyle sem UIFontMetrics, o que limita o suporte apenas à fonte do sistema SF Pro.
No Xcode 15+, abra o simulador e vá em Ajustes → Acessibilidade → Tela e Tamanho do Texto → Texto Maior. Arraste o controle deslizante para alterar o tamanho. No próprio Xcode, há Debug → Accessibility Inspector, que destaca elementos com fonte fixa. Para automação, use um teste que altere o UISlider das configurações via XCUITest — isso garante que todas as telas sejam reconstruídas corretamente.
Sim, Auto Layout com tipo dinâmico requer o uso de intrinsicContentSize em UILabel e UIButton. Em tamanhos de acessibilidade, o texto pode ultrapassar os limites da superview — adicione UIScrollView ou aumente as constraints leading/trailing. Use UIFontMetrics.scaledValue para padding, para que o espaçamento entre letras também seja dimensionado proporcionalmente à fonte.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também