Size Class é um mecanismo do iOS para layout adaptativo que divide todos os dispositivos em duas categorias por eixo: Compact (estreito/curto) e Regular (largo/comprido). Combinações desses valores determinam como a interface é exibida no iPhone, iPad, Mac Catalyst e CarPlay. De acordo com Apple Human Interface Guidelines, 2024, o Size Class permite construir um storyboard único para todos os dispositivos usando Auto Layout e UITraitCollection. O sistema funciona em todos os dispositivos iOS desde o iOS 8.
Pontos principais
Size Class é uma classificação abstrata de tela no iOS, introduzida pela Apple no iOS 8 para unificar o layout adaptativo. Em vez de verificar um modelo específico de dispositivo, o Size Class define duas características: espaço horizontal e vertical disponível. Cada característica assume um de dois valores — Compact (espaço limitado) ou Regular (espaço suficiente). A combinação desses valores forma uma trait collection, que é passada para todos os elementos da interface.
Antes do Size Class, os desenvolvedores criavam storyboards separados para iPhone e iPad ou usavam verificações UI_USER_INTERFACE_IDIOM() no código. Isso levava a duplicação de código, storyboards inchados e dificuldades em suportar novos tamanhos de tela. O Size Class resolveu o problema oferecendo um sistema universal: o desenvolvedor configura a interface para 4 combinações Compact/Regular, e o iOS seleciona automaticamente a adequada. Com o advento do Split View no iPad e dos diferentes tamanhos de iPhone, o sistema tornou-se indispensável para o layout adaptativo.
Size Class é calculado pelo iOS com base na largura e altura atuais da tela, levando em conta a orientação e multitarefa. Os valores não estão vinculados a pixels específicos — é uma categoria lógica. Por exemplo, o iPhone 16 Pro em retrato tem horizontal Compact e vertical Regular. O mesmo iPhone em paisagem — Compact em ambos os eixos. iPad em Split View com um aplicativo em 1/3 da tela obtém horizontal Compact, embora no modo tela cheia seja Regular. O sistema atualiza automaticamente o Size Class ao mudar a orientação ou Split View.
Size Class usa quatro combinações de dois valores em dois eixos. Cada combinação tem sua aplicação dependendo do tipo de dispositivo e sua orientação. Entender essas combinações é a base para projetar uma interface adaptativa para iOS. O sistema cobre todos os dispositivos Apple atuais: iPhone, iPad, Mac Catalyst e CarPlay. A Apple recomenda começar o design com a combinação wAny hAny (layout base) e refinar para combinações específicas.
wCompact hRegular — iPhone em retrato (exceto Plus/Max em alguns casos). wCompact hCompact — iPhone SE/6/7/8 em paisagem. wRegular hRegular — iPad em tela cheia em qualquer orientação, iPhone Plus/Max em paisagem. wRegular hCompact — iPad em paisagem com conteúdo estreito. Cada combinação determina quais constraints e elementos estão ativos. O desenvolvedor pode definir a aparência para cada combinação separadamente no Interface Builder.
No Mac Catalyst, o Size Class é sempre wRegular hRegular — interface de tamanho completo. Isso significa que a versão Mac de um aplicativo iPad obtém o máximo de espaço. O desenvolvedor pode usar verificações adicionais via UIScreen.traitCollection.userInterfaceIdiom para distinguir Mac de iPad. O Size Class no Mac funciona de forma estável, mas os aplicativos Catalyst frequentemente exigem adaptação adicional para mouse e teclado além do Size Class.
Size Class determina quais constraints do Auto Layout estão ativos, quais elementos da interface são visíveis e como as subviews são organizadas. O desenvolvedor pode definir diferentes constraints para diferentes Size Classes, e o iOS os alterna automaticamente quando a trait collection muda. Por exemplo, no iPad (wRegular hRegular) uma tabela com detalhes é exibida em Master-Detail, no iPhone (wCompact hRegular) — em Navigation Stack. Este é o cenário principal do layout adaptativo com Size Class.
No Interface Builder, o desenvolvedor seleciona uma combinação de Size Class através do botão Vary for Traits e adiciona constraints que devem se aplicar apenas para essa combinação. Constraints definidos para wAny hAny sempre se aplicam. Constraints definidos para uma combinação específica ativam apenas quando o Size Class corresponde. Se não houver constraints especiais para uma combinação, os base são usados. Quando o Size Class muda, o iOS anima a transição entre conjuntos de constraints.
O indicador Installed no Interface Builder permite ocultar elementos para Size Classes específicos. O desenvolvedor marca um elemento como Uninstalled para a combinação selecionada. Por exemplo, um botão Details é visível apenas no iPad (wRegular hRegular), e oculto no iPhone. Isso é mais simples do que gerenciar isHidden no código. Para ocultação programática, sobrescreva traitCollectionDidChange ou use o método willTransition, verificando o Size Class atual.
Interface Builder fornece a ferramenta visual Vary for Traits para trabalhar com Size Class. O desenvolvedor seleciona a combinação desejada (largura e altura), e o Interface Builder mostra uma prévia da tela para essa combinação. Todas as alterações de constraints, tamanhos, fontes e visibilidade feitas neste modo se aplicam apenas ao Size Class selecionado. Sair do modo salva as configurações. Esta abordagem substitui a necessidade de escrever código de adaptação para diferentes dispositivos.
Para configurar Size Class no Interface Builder, o desenvolvedor abre um storyboard, seleciona o view controller e clica no botão Vary for Traits no painel inferior. Em seguida, seleciona Width (Compact, Regular ou Any) e Height (Compact, Regular ou Any). A interface muda para o modo de edição para a combinação selecionada. Todas as alterações de constraints, adição ou remoção de elementos se aplicam apenas a esta combinação. Após finalizar a configuração, o desenvolvedor sai do modo — as alterações são salvas para a combinação específica de Size Class.
A Apple recomenda começar com um layout base para wAny hAny (a combinação base que cobre todos os dispositivos). Em seguida, refinar o layout para combinações problemáticas: wCompact hRegular (iPhone em retrato) e wRegular hRegular (iPad). Não é recomendado configurar todas as combinações — apenas aquelas onde o layout quebra. Configuração excessiva complica a manutenção. Para ajuste preciso de fontes, use Dynamic Type em vez de Size Class: as fontes se adaptam automaticamente ao tamanho da tela.
UITraitCollection é uma classe do iOS que contém o Size Class atual e outras características do ambiente (force touch, escala de tela, idiom de interface do usuário). Cada UIView e UIViewController tem seu próprio traitCollection, herdado do pai. O desenvolvedor obtém o Size Class através de traitCollection.horizontalSizeClass e traitCollection.verticalSizeClass, que retornam UIUserInterfaceSizeClass (.compact, .regular ou .unspecified). As alterações de Size Class são rastreadas sobrescrevendo traitCollectionDidChange.
Considere um exemplo de adaptação do layout de UICollectionView ao Size Class. No iPad (wRegular hRegular) use UICollectionViewCompositionalLayout com duas colunas, no iPhone (wCompact hRegular) — com uma. O código verifica o Size Class horizontal e seleciona o layout apropriado. Ao rotacionar ou entrar no Split View, o iOS chama traitCollectionDidChange, e o controlador alterna o layout com animação.
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.horizontalSizeClass == .Compact {
collectionView.collectionViewLayout = SingleColumnLayout()
} else {
collectionView.collectionViewLayout = DoubleColumnLayout()
}
}
O método traitCollectionDidChange é chamado em qualquer mudança de Size Class: rotação do dispositivo, entrada/saída de Split View, conexão de um display externo. Neste método, o desenvolvedor atualiza o layout, recarrega coleções, atualiza prioridades de constraints ou altera a visibilidade de elementos. É importante verificar se o Size Class realmente mudou, não outra característica: compare traitCollection.horizontalSizeClass com previousTraitCollection?.horizontalSizeClass. A otimização evita redesenho desnecessário quando force touch ou escala de tela mudam.
Diferentes dispositivos Apple têm diferentes combinações de Size Class, e o desenvolvedor deve levar em conta essas particularidades. iPhone em retrato — wCompact hRegular, em paisagem — depende do modelo: iPhone SE/6/7/8 (wCompact hCompact), iPhone X e mais novos (wCompact hCompact ou wCompact hRegular dependendo do conteúdo). iPad no modo tela cheia — wRegular hRegular, no Split View — pode ser wCompact hRegular (1/3 de tela) ou wRegular hRegular (2/3 de tela). Mac Catalyst — sempre wRegular hRegular.
No iPhone, o Size Class é estável para a maioria dos modelos, mas há nuances. iPhone Plus (6+, 7+, 8+) e Max (X, XS, 11 Pro, 13–16 Pro Max) em paisagem têm wRegular hCompact — como iPad mini. Isso permite colocar conteúdo em duas colunas em iPhones grandes em paisagem. iPhone SE (1ª–3ª geração) em paisagem — wCompact hCompact. Size Class vertical em todos os iPhones em retrato é Regular, exceto iPhone SE em paisagem onde é Compact. O horizontal é sempre Compact para retrato e paisagem (exceto Plus/Max em paisagem).
iPad no modo tela cheia — wRegular hRegular, proporcionando máxima flexibilidade de layout. No Split View, o comportamento muda: se o aplicativo ocupa 1/3 da tela (Slide Over ou Split em 1/3), o Size Class horizontal se torna Compact, embora o vertical permaneça Regular. Em 2/3 de tela — wRegular hRegular. O desenvolvedor deve testar a interface em todos os modos de Split View, pois o Size Class muda dinamicamente. A Apple recomenda usar o Size Class junto com UISplitViewController para comportamento consistente no iPad.
Perguntas frequentes
Size Class é um sistema discreto com 4 combinações, enquanto os breakpoints CSS são contínuos com um número arbitrário de pontos. Size Class abstrai de tamanhos de tela específicos, agrupando dispositivos por comportamento. Os breakpoints CSS estão vinculados a pixels, Size Class — a categorias lógicas Compact/Regular.
iPhone Plus/Max em paisagem tem largura de tela suficiente para exibir conteúdo em duas colunas (como iPad mini). A Apple atribui Regular horizontal para que o desenvolvedor possa usar layout multicoluna sem verificações adicionais. Esta é uma exceção à regra Compact para iPhone.
Size Class é determinado pelo iOS com base nas características reais do dispositivo e não pode ser alterado a partir do código do aplicativo. O desenvolvedor só pode reagir ao valor atual. A UI do sistema pode sobrescrever o Size Class para elementos do sistema, mas no aplicativo isso é impossível.
SwiftUI não usa Size Class diretamente — em vez disso, o desenvolvedor usa o modificador @Environment(\.horizontalSizeClass) para ler o valor atual. O SwiftUI oferece ferramentas de alto nível: Size Classes e AnyLayout com o protocolo Layout para layout adaptativo.
Sim, ao conectar um display externo via Stage Manager ou Sidecar, o iOS atualiza o Size Class. O monitor externo geralmente obtém wRegular hRegular, enquanto a tela principal mantém seu Size Class. traitCollectionDidChange é chamado para janelas em cada tela independentemente.
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