iOS - détection courant de la taille des classes sur viewDidLoad
je travaille avec la mise en page adaptative sur iOS 8 et je veux obtenir exactement ce que les classes de taille sont sur viewDidLoad
. Toutes les idées à ce sujet?
4 réponses
à partir de iOS 8 UIViewController adopte le Uitraitenvironnement protocole. Ce protocole déclare une propriété nommée traitCollection est de type UITraitCollection. Vous pouvez en effet accéder à l' traitCollection propriété simplement en utilisant self.traitCollection
UITraitCollection possède deux propriétés auxquelles vous voulez accéder nommé horizontalSizeClass et verticalSizeClass accéder à ces propriétés retourner un NSInteger. L'énumération qui définit les valeurs renvoyées est déclaré dans la documentation officielle comme suit:(cela pourrait être ajouté à l'avenir!)
typedef NS_ENUM (NSInteger, UIUserInterfaceSizeClass {
UIUserInterfaceSizeClassUnspecified = 0,
UIUserInterfaceSizeClassCompact = 1,
UIUserInterfaceSizeClassRegular = 2,
};
ainsi vous pouvez obtenir la classe et utiliser par exemple un commutateur pour déterminer votre direction de 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 obtenir les classes de retour comme un n-uplet.
extension UIViewController {
func sizeClass() -> (UIUserInterfaceSizeClass, UIUserInterfaceSizeClass) {
return (self.traitCollection.horizontalSizeClass, self.traitCollection.verticalSizeClass)
}
}
exemple Switch instruction to consume the function:
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")
}
Modifier/Outre:
si vous essayez d'accéder à la collection de traits tôt dans le UIViewController
's du cycle de vie, ils pourraient tous être UIUserInterfaceSizeClass.unspecified
.
cela peut être pénible si vous faites des contraintes dans le code.
je recommande l'accès au .traitCollection
à partir de UIScreen
objet partagé.
UIScreen.main.traitCollection
Ou encore plus utile:
UIScreen.main.traitCollection.userInterfaceIdiom
C'est gentil pour les tests et le débogage:
let sizeClasses = ["Unspecified", "Compact", "Regular"]
print("SizeClass w:\(sizeClasses[traitCollection.horizontalSizeClass.rawValue]) h:\(sizeClasses[traitCollection.verticalSizeClass.rawValue])")
ainsi, pour la mise en page automatique, vous concevez L'interface utilisateur de vos applications pour chaque classe de taille différente. L'OS fait tout le travail de comprendre le dispositif utilisé et quelle classe de taille devrait être utilisé. Cependant, si vous Il ya un moyen de comprendre quel appareil est utilisé. Je ne suis pas sûr si vous pouvez décider quelle classe de taille est utilisé, car, encore une fois, ce est géré dynamiquement par L'OS.
Code pour obtenir de l'appareil utilisé:
NSString *device = [[UIDevice currentDevice]model ] ;
NSLog(@"%@",device);