首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS-在viewDidLoad上检测当前大小类

iOS-在viewDidLoad上检测当前大小类
EN

Stack Overflow用户
提问于 2015-04-09 02:22:23
回答 5查看 27.9K关注 0票数 43

我正在使用iOS 8上的自适应布局,我想确切地了解viewDidLoad上的大小类。对此有什么想法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-04-09 03:57:09

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

UITraitCollection有两个要访问的属性,名为horizontalSizeClass,而访问这些属性的verticalSizeClass则返回NSInteger。定义返回值的枚举在正式文档中声明如下(这可能会在将来添加到!)

代码语言:javascript
运行
复制
typedef NS_ENUM (NSInteger, UIUserInterfaceSizeClass {
   UIUserInterfaceSizeClassUnspecified = 0,
   UIUserInterfaceSizeClassCompact     = 1,
   UIUserInterfaceSizeClassRegular     = 2,
};

这样您就可以得到类并使用一个开关来确定您的代码方向。一个例子可以是-

代码语言:javascript
运行
复制
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.
票数 87
EN

Stack Overflow用户

发布于 2017-04-10 17:26:40

Swift 4的一些有用的东西:

UIViewController扩展,使类返回为元组。

代码语言:javascript
运行
复制
extension UIViewController {
  func sizeClass() -> (UIUserInterfaceSizeClass, UIUserInterfaceSizeClass) {
      return (self.traitCollection.horizontalSizeClass, self.traitCollection.verticalSizeClass)
  }
}

示例Switch语句来使用该函数:

代码语言:javascript
运行
复制
    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")
    }

编辑/添加:

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

如果您碰巧在代码中执行约束,这可能会很痛苦。

我建议从.traitCollection共享对象访问UIScreen

代码语言:javascript
运行
复制
UIScreen.main.traitCollection

或者更有用:

代码语言:javascript
运行
复制
UIScreen.main.traitCollection.userInterfaceIdiom
票数 20
EN

Stack Overflow用户

发布于 2018-10-26 10:38:03

你也可以在Swift 5中这样做

代码语言:javascript
运行
复制
enum DeviceTraitStatus {
    ///IPAD and others: Width: Regular, Height: Regular
    case wRhR
    ///Any IPHONE Portrait Width: Compact, Height: Regular
    case wChR
    ///IPHONE Plus/Max Landscape Width: Regular, Height: Compact
    case wRhC
    ///IPHONE landscape Width: Compact, Height: Compact
    case wChC

    static var current:DeviceTraitStatus{

        switch (UIScreen.main.traitCollection.horizontalSizeClass, UIScreen.main.traitCollection.verticalSizeClass){

        case (UIUserInterfaceSizeClass.regular, UIUserInterfaceSizeClass.regular):      
            return .wRhR
        case (UIUserInterfaceSizeClass.compact, UIUserInterfaceSizeClass.regular):
            return .wChR
        case (UIUserInterfaceSizeClass.regular, UIUserInterfaceSizeClass.compact):
            return .wRhC
        case (UIUserInterfaceSizeClass.compact, UIUserInterfaceSizeClass.compact):
            return .wChC
        default:
            return .wChR

        }

    }

}

主要的优点是不仅可以从UIViewController类依赖者中使用,而且静态方法可以进入一个即帮助类。因此,您可以在代码中的某个位置执行以下操作:

代码语言:javascript
运行
复制
let textSize:CGFloat = DeviceTraitStatus.current == .wRhR ? 18:14
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29528661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档