Dynamic Type: o que é, dimensionamento de fontes no iOS

Autor: IT Sectr Publicado: 2026-02-26 Tempo de leitura: 8 min
Dynamic Type é um sistema automático de dimensionamento de fontes no iOS, integrado ao sistema operacional desde o iOS 7. Diferente do tamanho de texto fixo, o Dynamic Type ajusta o tamanho da fonte de acordo com as configurações de acessibilidade do sistema escolhidas pelo usuário em Ajustes → Tela e Tamanho do Texto. De acordo com as Apple Human Interface Guidelines (2025), o suporte ao tipo dinâmico aumenta a legibilidade da interface para 32% dos usuários que alteram o tamanho da fonte através das configurações de acessibilidade.

Principais Pontos

  • Dynamic Type é um sistema integrado do iOS para dimensionamento automático de fontes com base nas configurações do usuário, disponível desde o iOS 7.
  • UIFontMetrics (iOS 11+) é a principal API para adaptar fontes personalizadas ao tipo dinâmico, mantendo as proporções.
  • Estilos de texto — 11 estilos predefinidos de .largeTitle a .caption2, cada um com tamanho e peso específicos.
  • Auto Layout responde corretamente a alterações de fonte via intrinsicContentSize — o layout é recalculado automaticamente.
  • Dynamic Type é obrigatório para aprovação no App Review e recomendado pela Apple para conformidade com acessibilidade.

O que é Dynamic Type?

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.

Estilos de texto no iOS: de largeTitle a caption2

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: adaptação de fontes personalizadas

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%.

Exemplos de código em Swift

Exemplo 1: Fonte do sistema via preferredFontForTextStyle

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.

swift
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.

Exemplo 2: Fonte personalizada via UIFontMetrics

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.

swift
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.

Exemplo 3: Assinatura de alterações de tamanho

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.

swift
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 funciona em todas as versões do iOS?

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.

Como testar Dynamic Type no Xcode?

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.

O layout deve ser dimensionado para Dynamic Type?

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

  • Dynamic Type é um sistema automático de dimensionamento de fontes no iOS que responde às configurações de acessibilidade do sistema do usuário.
  • 11 estilos de texto (de .largeTitle 34pt a .caption2 11pt) cobrem todos os cenários de interface — de títulos a legendas.
  • UIFontMetrics (iOS 11+) é a única API correta para adaptar fontes personalizadas ao tipo dinâmico.
  • A flag adjustsFontForContentSizeCategory = true atualiza automaticamente as fontes de UILabel e UIButton quando o tamanho do sistema muda.
  • Assinar UIContentSizeCategory.didChangeNotification é necessário para elementos de UI personalizados que não herdam a atualização padrão.
  • Dynamic Type é obrigatório para aprovação no App Review em aplicativos com funcionalidade de texto, conforme recomendação da Apple.
  • Use UIFontMetrics.scaledFont(for:) em todos os projetos — esta é a única maneira de preservar a fonte do designer em todos os tamanhos de acessibilidade.

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.

Discutir o projeto

Leia também