Size Class es un mecanismo de iOS para diseño adaptativo que divide todos los dispositivos en dos categorías por cada eje: Compact (estrecho/corto) y Regular (ancho/largo). Las combinaciones de estos valores determinan cómo se muestra la interfaz en iPhone, iPad, Mac Catalyst y CarPlay. Según Apple Human Interface Guidelines, 2024, Size Class permite construir un storyboard único para todos los dispositivos usando Auto Layout y UITraitCollection. El sistema funciona en todos los dispositivos iOS desde iOS 8.
Puntos clave
Size Class es una clasificación abstracta de pantalla en iOS, introducida por Apple en iOS 8 para unificar el diseño adaptativo. En lugar de verificar un modelo específico de dispositivo, Size Class define dos características: espacio horizontal y vertical disponible. Cada característica toma uno de dos valores — Compact (espacio limitado) o Regular (espacio suficiente). La combinación de estos valores forma una trait collection, que se pasa a todos los elementos de la interfaz.
Antes de Size Class, los desarrolladores creaban storyboards separados para iPhone y iPad o usaban comprobaciones UI_USER_INTERFACE_IDIOM() en código. Esto llevaba a duplicación de código, storyboards inflados y dificultades para soportar nuevos tamaños de pantalla. Size Class resolvió el problema ofreciendo un sistema universal: el desarrollador configura la interfaz para 4 combinaciones Compact/Regular, e iOS selecciona automáticamente la adecuada. Con la llegada de Split View en iPad y los diferentes tamaños de iPhone, el sistema se volvió indispensable para el diseño adaptativo.
Size Class es calculado por iOS basándose en el ancho y alto actual de la pantalla, teniendo en cuenta la orientación y la multitarea. Los valores no están vinculados a píxeles específicos — es una categoría lógica. Por ejemplo, el iPhone 16 Pro en portrait tiene horizontal Compact y vertical Regular. El mismo iPhone en landscape — Compact en ambos ejes. El iPad en Split View con una aplicación en 1/3 de la pantalla obtiene horizontal Compact, aunque en modo pantalla completa es Regular. El sistema actualiza automáticamente el Size Class al cambiar la orientación o Split View.
Size Class utiliza cuatro combinaciones de dos valores en dos ejes. Cada combinación tiene su aplicación según el tipo de dispositivo y su orientación. Comprender estas combinaciones es la base para diseñar una interfaz adaptativa en iOS. El sistema cubre todos los dispositivos Apple actuales: iPhone, iPad, Mac Catalyst y CarPlay. Apple recomienda comenzar el diseño con la combinación wAny hAny (layout base) y refinar para combinaciones específicas.
wCompact hRegular — iPhone en portrait (excepto Plus/Max en algunos casos). wCompact hCompact — iPhone SE/6/7/8 en landscape. wRegular hRegular — iPad en pantalla completa en cualquier orientación, iPhone Plus/Max en landscape. wRegular hCompact — iPad en landscape con contenido estrecho. Cada combinación determina qué constraints y elementos están activos. El desarrollador puede definir la apariencia para cada combinación por separado en Interface Builder.
En Mac Catalyst, Size Class es siempre wRegular hRegular — interfaz de tamaño completo. Esto significa que la versión Mac de una aplicación de iPad obtiene el máximo espacio. El desarrollador puede usar comprobaciones adicionales mediante UIScreen.traitCollection.userInterfaceIdiom para distinguir Mac de iPad. Size Class en Mac funciona de forma estable, pero las aplicaciones Catalyst a menudo requieren adaptación adicional para ratón y teclado más allá de Size Class.
Size Class determina qué constraints de Auto Layout están activos, qué elementos de la interfaz son visibles y cómo se organizan las subviews. El desarrollador puede establecer diferentes constraints para diferentes Size Classes, e iOS los cambia automáticamente al modificar la trait collection. Por ejemplo, en iPad (wRegular hRegular) una tabla con detalle se muestra en Master-Detail, en iPhone (wCompact hRegular) — en Navigation Stack. Este es el escenario principal del diseño adaptativo con Size Class.
En Interface Builder, el desarrollador selecciona una combinación de Size Class mediante el botón Vary for Traits y añade constraints que deben aplicarse solo para esa combinación. Los constraints establecidos para wAny hAny siempre se aplican. Los constraints establecidos para una combinación específica se activan solo cuando el Size Class coincide. Si no hay constraints especiales para una combinación, se usan los base. Al cambiar el Size Class, iOS anima la transición entre conjuntos de constraints.
El indicador Installed en Interface Builder permite ocultar elementos para Size Classes específicos. El desarrollador marca un elemento como Uninstalled para la combinación seleccionada. Por ejemplo, un botón Details es visible solo en iPad (wRegular hRegular), y oculto en iPhone. Esto es más simple que gestionar isHidden en código. Para ocultación programática, se sobrescribe traitCollectionDidChange o se usa el método willTransition, verificando el Size Class actual.
Interface Builder proporciona la herramienta visual Vary for Traits para trabajar con Size Class. El desarrollador selecciona la combinación deseada (ancho y alto), e Interface Builder muestra una vista previa de la pantalla para esa combinación. Todos los cambios de constraints, tamaños, fuentes y visibilidad realizados en este modo se aplican solo al Size Class seleccionado. Al salir del modo, se guardan los ajustes. Este enfoque reemplaza la necesidad de escribir código de adaptación para diferentes dispositivos.
Para configurar Size Class en Interface Builder, el desarrollador abre un storyboard, selecciona el view controller y hace clic en el botón Vary for Traits en el panel inferior. Luego selecciona Width (Compact, Regular o Any) y Height (Compact, Regular o Any). La interfaz cambia al modo de edición para la combinación seleccionada. Todos los cambios de constraints, adición o eliminación de elementos se aplican solo a esta combinación. Al finalizar la configuración, el desarrollador sale del modo — los cambios se guardan para la combinación específica de Size Class.
Apple recomienda comenzar con un layout base para wAny hAny (la combinación base que cubre todos los dispositivos). Luego refinar el layout para combinaciones problemáticas: wCompact hRegular (iPhone en portrait) y wRegular hRegular (iPad). No se recomienda configurar cada combinación — solo aquellas donde el layout se rompe. La configuración excesiva complica el mantenimiento. Para ajuste preciso de fuentes, use Dynamic Type en lugar de Size Class: las fuentes se adaptan automáticamente al tamaño de pantalla.
UITraitCollection es una clase de iOS que contiene el Size Class actual y otras características del entorno (force touch, escala de pantalla, idiom de interfaz de usuario). Cada UIView y UIViewController tiene su propio traitCollection, heredado del padre. El desarrollador obtiene Size Class mediante traitCollection.horizontalSizeClass y traitCollection.verticalSizeClass, que devuelven UIUserInterfaceSizeClass (.compact, .regular o .unspecified). Los cambios de Size Class se rastrean sobrescribiendo traitCollectionDidChange.
Considere un ejemplo de adaptación del layout de UICollectionView al Size Class. En iPad (wRegular hRegular) use UICollectionViewCompositionalLayout con dos columnas, en iPhone (wCompact hRegular) — con una. El código verifica el Size Class horizontal y selecciona el layout apropiado. Al rotar o cambiar a Split View, iOS llama a traitCollectionDidChange, y el controlador cambia el layout con animación.
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.horizontalSizeClass == .Compact {
collectionView.collectionViewLayout = SingleColumnLayout()
} else {
collectionView.collectionViewLayout = DoubleColumnLayout()
}
}
El método traitCollectionDidChange se llama ante cualquier cambio de Size Class: rotación del dispositivo, entrada/salida de Split View, conexión de una pantalla externa. En este método, el desarrollador actualiza el layout, recarga colecciones, actualiza prioridades de constraints o cambia la visibilidad de elementos. Es importante verificar si realmente cambió el Size Class, no otra característica: compare traitCollection.horizontalSizeClass con previousTraitCollection?.horizontalSizeClass. La optimización evita redibujados innecesarios al cambiar force touch o escala de pantalla.
Diferentes dispositivos Apple tienen diferentes combinaciones de Size Class, y el desarrollador debe tener en cuenta estas particularidades. iPhone en portrait — wCompact hRegular, en landscape — depende del modelo: iPhone SE/6/7/8 (wCompact hCompact), iPhone X y posteriores (wCompact hCompact o wCompact hRegular según el contenido). iPad en modo pantalla completa — wRegular hRegular, en Split View — puede ser wCompact hRegular (1/3 de pantalla) o wRegular hRegular (2/3 de pantalla). Mac Catalyst — siempre wRegular hRegular.
En iPhone, Size Class es estable para la mayoría de modelos, pero hay matices. iPhone Plus (6+, 7+, 8+) y Max (X, XS, 11 Pro, 13–16 Pro Max) en landscape tienen wRegular hCompact — como iPad mini. Esto permite colocar contenido en dos columnas en iPhones grandes en landscape. iPhone SE (1ª–3ª generación) en landscape — wCompact hCompact. Size Class vertical en todos los iPhone en portrait es Regular, excepto iPhone SE en landscape donde es Compact. El horizontal es siempre Compact para portrait y landscape (excepto Plus/Max en landscape).
iPad en modo pantalla completa — wRegular hRegular, proporcionando máxima flexibilidad de layout. En Split View, el comportamiento cambia: si la aplicación ocupa 1/3 de la pantalla (Slide Over o Split al 1/3), el Size Class horizontal se vuelve Compact, aunque el vertical sigue siendo Regular. Con 2/3 de pantalla — wRegular hRegular. El desarrollador debe probar la interfaz en todos los modos de Split View, ya que Size Class cambia dinámicamente. Apple recomienda usar Size Class junto con UISplitViewController para un comportamiento consistente en iPad.
Preguntas frecuentes
Size Class es un sistema discreto con 4 combinaciones, mientras que los breakpoints de CSS son continuos con un número arbitrario de puntos. Size Class se abstrae de tamaños de pantalla específicos, agrupando dispositivos por comportamiento. Los breakpoints de CSS están vinculados a píxeles, Size Class — a categorías lógicas Compact/Regular.
iPhone Plus/Max en landscape tiene suficiente ancho de pantalla para mostrar contenido en dos columnas (como iPad mini). Apple asigna Regular horizontal para que el desarrollador pueda usar un diseño multicolumna sin comprobaciones adicionales. Esta es una excepción a la regla Compact para iPhone.
Size Class es determinado por iOS basándose en las características reales del dispositivo y no se puede cambiar desde el código de la aplicación. El desarrollador solo puede reaccionar al valor actual. La UI del sistema puede sobrescribir Size Class para elementos del sistema, pero en la aplicación esto es imposible.
SwiftUI no usa Size Class directamente — en su lugar, el desarrollador usa el modificador @Environment(\.horizontalSizeClass) para leer el valor actual. SwiftUI ofrece herramientas de mayor nivel: Size Classes y AnyLayout con el protocolo Layout para diseño adaptativo.
Sí, al conectar una pantalla externa mediante Stage Manager o Sidecar, iOS actualiza Size Class. El monitor externo generalmente obtiene wRegular hRegular, mientras que la pantalla principal conserva su Size Class. traitCollectionDidChange se llama para las ventanas de cada pantalla de forma independiente.
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