titles prefer large bar ios size-classes

prefer - iOS- Detectar clases de tamaño actual en viewDidLoad



swift navigation bar large title (4)

Estoy trabajando con Layout adaptable en iOS 8 y quiero obtener exactamente el tamaño de las clases en viewDidLoad . ¿Alguna idea sobre eso?


A partir de iOS 8, UIViewController adopta el protocolo UITraitEnvironment . Este protocolo declara una propiedad llamada traitCollection que es de tipo UITraitCollection . Por lo tanto, puede acceder a la propiedad traitCollection simplemente usando self.traitCollection

UITraitCollection tiene dos propiedades a las que desea acceder denominadas horizontalSizeClass y verticalSizeClass. El acceso a estas propiedades devuelve un NSInteger . La enumeración que define los valores devueltos se declara en la documentación oficial de la siguiente manera (¡esto podría potencialmente agregarse en el futuro!)

typedef NS_ENUM (NSInteger, UIUserInterfaceSizeClass { UIUserInterfaceSizeClassUnspecified = 0, UIUserInterfaceSizeClassCompact = 1, UIUserInterfaceSizeClassRegular = 2, };

Así que podrías obtener la clase y usar, por ejemplo, un interruptor para determinar la dirección de tu código. Un ejemplo podría ser:

NSInteger horizontalClass = self.traitCollection.horizontalSizeClass; NSInteger verticalCass = self.traitCollection.verticalSizeClass; switch (horizontalClass) { case UIUserInterfaceSizeClassCompact : // horizontal is compact class.. do stuff... break; case UIUserInterfaceSizeClassRegular : // horizontal is regular class.. do stuff... break; default : // horizontal is unknown.. break; } // continue similarly for verticalClass etc.


Algunas cosas útiles para Swift 4:

UIViewController Extension para recuperar las clases como un Tuple.

extension UIViewController { func sizeClass() -> (UIUserInterfaceSizeClass, UIUserInterfaceSizeClass) { return (self.traitCollection.horizontalSizeClass, self.traitCollection.verticalSizeClass) } }

Ejemplo de instrucción Switch para consumir la función:

switch self.sizeClass() { case (UIUserInterfaceSizeClass.unspecified, UIUserInterfaceSizeClass.unspecified): print("Unknown") case (UIUserInterfaceSizeClass.unspecified, UIUserInterfaceSizeClass.compact): print("Unknown width, compact height") case (UIUserInterfaceSizeClass.unspecified, UIUserInterfaceSizeClass.regular): print("Unknown width, regular height") case (UIUserInterfaceSizeClass.compact, UIUserInterfaceSizeClass.unspecified): print("Compact width, unknown height") case (UIUserInterfaceSizeClass.regular, UIUserInterfaceSizeClass.unspecified): print("Regular width, unknown height") case (UIUserInterfaceSizeClass.regular, UIUserInterfaceSizeClass.compact): print("Regular width, compact height") case (UIUserInterfaceSizeClass.compact, UIUserInterfaceSizeClass.compact): print("Compact width, compact height") case (UIUserInterfaceSizeClass.regular, UIUserInterfaceSizeClass.regular): print("Regualr width, regular height") case (UIUserInterfaceSizeClass.compact, UIUserInterfaceSizeClass.regular): print("Compact width, regular height") }

Edición / Adición:

Si está intentando acceder a la colección de rasgos al principio del ciclo de vida de UIUserInterfaceSizeClass.unspecified todos podrían ser UIUserInterfaceSizeClass.unspecified .

Esto puede ser una molestia si haces restricciones en el código.

Recomiendo acceder a .traitCollection desde el objeto compartido UIScreen .

UIScreen.main.traitCollection

O incluso más útil:

UIScreen.main.traitCollection.userInterfaceIdiom


Así que para Auto Layout, diseñas la interfaz de usuario de tus aplicaciones para cada clase de tamaño diferente. El sistema operativo hace todo el trabajo de averiguar el dispositivo que se está utilizando y qué clase de tamaño se debe usar. Sin embargo, si hay una manera de averiguar qué dispositivo se está utilizando. No estoy seguro de si puede decidir qué clase de tamaño se utiliza, ya que, de nuevo, el sistema operativo lo maneja de forma dinámica.

Código para el uso del dispositivo:

NSString *device = [[UIDevice currentDevice]model ] ; NSLog(@"%@",device);


Esto es bueno para probar / depurar:

let sizeClasses = ["Unspecified", "Compact", "Regular"] print("SizeClass w:/(sizeClasses[traitCollection.horizontalSizeClass.rawValue]) h:/(sizeClasses[traitCollection.verticalSizeClass.rawValue])")