0Pricing
Swift Academy · Aula

Medição de Subviews

Consulte os tamanhos das subviews durante o layout.

Medição de Subviews é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.

A Medição Orienta a Disposição

Antes de posicionar os filhos, você precisa medi-los. O layout do SwiftUI é uma negociação: o pai propõe tamanhos, os filhos respondem e você concilia as respostas.

Perguntando o Tamanho de uma Subvisualização

Cada representante em Subviews responde a sizeThatFits(_:) para uma determinada ProposedViewSize. O representante retorna o tamanho que o filho ocuparia sob essa proposta.

let size = subview.sizeThatFits(.unspecified)

As Três Propostas de Sondagem

Para conhecer a flexibilidade de um filho, consulte-o de três maneiras: .zero revela seu tamanho mínimo, .infinity, seu tamanho máximo, e .unspecified, seu tamanho ideal.

let minSize = subview.sizeThatFits(.zero)
let maxSize = subview.sizeThatFits(.infinity)
let ideal = subview.sizeThatFits(.unspecified)

Propondo uma Largura Específica

Para texto com quebra de linha, proponha uma largura específica e deixe a altura como nil. O filho informa a altura necessária para essa largura.

let proposal = ProposedViewSize(width: 200, height: nil)
let fit = subview.sizeThatFits(proposal)

Prioridade de layout

Cada subvisualização expõe uma priority (definida por .layoutPriority). Quando o espaço é limitado, atribua primeiro o tamanho ideal aos elementos filhos de maior prioridade.

for subview in subviews {
    let p = subview.priority
    // distribute space to higher priority first
}

Lendo Valores Personalizados

As subvisualizações podem carregar dados tipados por meio de uma LayoutValueKey. O layout lê subview[MyKey.self] para influenciar o posicionamento — por exemplo, um spacing por item.

private struct RankKey: LayoutValueKey {
    static let defaultValue: Int = 0
}
let rank = subviews[0][RankKey.self]

Definindo um Valor de Layout

Uma visualização define seu valor de layout com o modificador layoutValue(key:value:), permitindo que os elementos filhos comuniquem sugestões ao seu layout.

Text("Featured").layoutValue(key: RankKey.self, value: 10)

Espaçamento entre Subvisualizações

As subvisualizações expõem preferências de spacing. Use subview.spacing.distance(to:along:) para obter o gap recomendado entre dois elementos filhos adjacentes ao longo de um eixo.

let gap = subviews[0].spacing.distance(
    to: subviews[1].spacing, along: .horizontal)

Acumulando Tamanhos

Um layout horizontal soma as larguras dos elementos filhos e usa a maior altura. Medir todos os elementos filhos primeiro permite calcular o tamanho do contêiner antes de posicionar qualquer elemento.

let sizes = subviews.map { $0.sizeThatFits(.unspecified) }
let totalWidth = sizes.reduce(0) { $0 + $1.width }
let maxHeight = sizes.map(\.height).max() ?? 0

Medindo Novamente Durante o Posicionamento

Em placeSubviews, você precisa medir novamente (ou reutilizar os tamanhos armazenados em cache) para que as posições correspondam ao que foi informado. As medições são chamadas proxy rápidas, não renderizações reais.

func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) {
    for s in subviews {
        let size = s.sizeThatFits(.unspecified)
        // use size to position s
        _ = size
    }
}

Respeitando a Proposta do Elemento Pai

Sempre respeite a proposta recebida. Se o elemento pai propuser uma largura fixa, organize os elementos filhos dentro dela; não ultrapasse os limites silenciosamente, pois o layout será recortado.

let containerWidth = proposal.width ?? .infinity

Verificação Rápida: Medição

Teste sua compreensão sobre a medição de subvisualizações.

Recapitulação: Medindo Subvisualizações

A medição é o coração de um layout personalizado. Consulte os elementos filhos com .zero, .infinity e .unspecified para descobrir os tamanhos mínimo, máximo e ideal, proponha larguras concretas para conteúdos que quebram linha e respeite a prioridade de layout e as preferências de spacing.

Os valores personalizados de LayoutValueKey permitem que os elementos filhos transmitam sugestões. Faça as medições de forma consistente nos dois métodos do protocolo para que o tamanho informado e o posicionamento estejam sempre de acordo.

Perguntas Frequentes

A aula “Medição de Subviews” é grátis?

Sim — o texto completo de “Medição de Subviews” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.

O que vou aprender em “Medição de Subviews”?

Consulte os tamanhos das subviews durante o layout. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Swift Academy?

Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Medição de Subviews”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Swift Academy?

Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Noções Básicas do Protocolo Layout
  2. Medição de Subviews
  3. Construção de um Layout de Fluxo
  4. Cache de Layout e Desempenho
← Voltar para Swift Academy