iOS – Détecter les classs de taille actuelles sur viewDidLoad

Je travaille avec la layout adaptative sur iOS 8 et je veux get exactement ce que les classs de taille sont sur viewDidLoad . Des idées à ce sujet?

Depuis iOS 8, UIViewController adopte le protocole UITraitEnvironment . Ce protocole déclare une propriété appelée traitCollection qui est de type UITraitCollection . Vous pouvez donc accéder à la propriété traitCollection simplement en utilisant self.traitCollection

UITraitCollection a deux propriétés auxquelles vous souhaitez accéder nommées horizontalSizeClass et verticalSizeClass L' access à ces propriétés renvoie un NSInteger . L'énumération qui définit les valeurs renvoyées est déclarée dans la documentation officielle comme suit – (ceci pourrait potentiellement être ajouté à l'avenir!)

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

Vous pouvez donc get la class et utiliser un commutateur pour déterminer la direction de votre code. Un exemple pourrait être –

 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. 

Quelques trucs utiles pour Swift 4:

UIViewController Extension pour récupérer les classs en tant que Tuple.

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

Exemple d'instruction Switch pour consumr la fonction:

  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") } 

C'est bien pour tester / déboguer:

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

Ainsi, pour Auto Layout, vous concevez l'interface user de vos applications pour chaque class de taille différente. L'OS fait tout le travail de déterminer l'appareil utilisé et quelle class de taille devrait être utilisée. Cependant, si vous avez un moyen de déterminer quel périphérique est utilisé. Je ne suis pas sûr si vous pouvez décider quelle class de taille est utilisée car, encore une fois, ceci est géré dynamicment par le operating system.

Code pour l'utilisation de l'appareil:

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