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?

29
demandé sur Suragch 2015-04-09 05:22:23

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.
61
répondu Bamsworld 2015-04-09 04:15:01

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
12
répondu Jon Vogel 2018-01-25 19:14:33

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])")
2
répondu coco 2016-12-18 16:22:28

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);
-10
répondu Treverp 2015-04-09 02:50:57