iOS-检测viewDidLoad上的当前大小类

use*_*307 33 ios size-classes

我正在iOS 8上使用自适应布局,我希望得到大小类的确切内容viewDidLoad.关于那个的任何想法?

Bam*_*rld 72

从iOS 8开始,UIViewController采用UITraitEnvironment协议.此协议声明了一个名为traitCollection的属性,该属性的类型为UITraitCollection.因此,您只需使用即可访问traitCollection属性self.traitCollection

UITraitCollection有两个要访问的属性,名为horizo​​ntalSizeClassverticalSizeClass访问这些属性会返回一个NSInteger.定义返回值的枚举在官方文档中声明如下 - (这可能会在将来添加!)

typedef NS_ENUM (NSInteger, UIUserInterfaceSizeClass {
   UIUserInterfaceSizeClassUnspecified = 0,
   UIUserInterfaceSizeClassCompact     = 1,
   UIUserInterfaceSizeClassRegular     = 2,
};
Run Code Online (Sandbox Code Playgroud)

所以你可以得到这个类并使用一个开关来确定你的代码方向.一个例子可能是 -

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.
Run Code Online (Sandbox Code Playgroud)

  • viewDidLoad是一个用于执行size clas依赖的东西的坏地方,因为size类可能未指定,例如当视图还没有superview时.根据苹果的更好的地方是`viewWillLayoutSubViews`:https://developer.apple.com/videos/play/wwdc2016-233/?time = 1263 (4认同)

Jon*_*gel 13

Swift 4的一些有用的东西:

UIViewController扩展以将类作为元组返回.

extension UIViewController {
  func sizeClass() -> (UIUserInterfaceSizeClass, UIUserInterfaceSizeClass) {
      return (self.traitCollection.horizontalSizeClass, self.traitCollection.verticalSizeClass)
  }
}
Run Code Online (Sandbox Code Playgroud)

使用函数的示例Switch语句:

    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")
    }
Run Code Online (Sandbox Code Playgroud)

编辑/添加:

如果您试图在UIViewController生命周期的早期访问特征集合,那么它们可能都是UIUserInterfaceSizeClass.unspecified.

如果碰巧在代码中做约束,这可能会很痛苦.

我建议.traitCollectionUIScreen共享对象访问.

UIScreen.main.traitCollection
Run Code Online (Sandbox Code Playgroud)

甚至更有用:

UIScreen.main.traitCollection.userInterfaceIdiom
Run Code Online (Sandbox Code Playgroud)

  • 很好,但如果从示例中删除所有出现的'UIUserInterfaceSizeClass',则更干净. (3认同)