我正在使用iOS 8上的自适应布局,我想确切地了解viewDidLoad
上的大小类。对此有什么想法吗?
发布于 2015-04-09 03:57:09
从UIViewController 8开始,iOS采用了UITraitEnvironment协议。此协议声明一个名为traitCollection的属性,该属性的类型为UITraitCollection.。因此,只需使用traitCollection就可以访问self.traitCollection
属性。
UITraitCollection有两个要访问的属性,名为horizontalSizeClass,而访问这些属性的verticalSizeClass则返回NSInteger。定义返回值的枚举在正式文档中声明如下(这可能会在将来添加到!)
typedef NS_ENUM (NSInteger, UIUserInterfaceSizeClass {
UIUserInterfaceSizeClassUnspecified = 0,
UIUserInterfaceSizeClassCompact = 1,
UIUserInterfaceSizeClassRegular = 2,
};
这样您就可以得到类并使用一个开关来确定您的代码方向。一个例子可以是-
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.
发布于 2017-04-10 17:26:40
Swift 4的一些有用的东西:
UIViewController扩展,使类返回为元组。
extension UIViewController {
func sizeClass() -> (UIUserInterfaceSizeClass, UIUserInterfaceSizeClass) {
return (self.traitCollection.horizontalSizeClass, self.traitCollection.verticalSizeClass)
}
}
示例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")
}
编辑/添加:
如果您试图在UIViewController
生命周期的早期访问特性集合,那么它们都可能是UIUserInterfaceSizeClass.unspecified
。
如果您碰巧在代码中执行约束,这可能会很痛苦。
我建议从.traitCollection
共享对象访问UIScreen
。
UIScreen.main.traitCollection
或者更有用:
UIScreen.main.traitCollection.userInterfaceIdiom
发布于 2018-10-26 10:38:03
你也可以在Swift 5中这样做
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类依赖者中使用,而且静态方法可以进入一个即帮助类。因此,您可以在代码中的某个位置执行以下操作:
let textSize:CGFloat = DeviceTraitStatus.current == .wRhR ? 18:14
https://stackoverflow.com/questions/29528661
复制相似问题