iOS- 在 viewDidLoad 上检测当前大小 类
iOS- Detect current size classes on viewDidLoad
我在 iOS 8 上使用自适应布局,我想准确了解 类 在 viewDidLoad
上的大小。对此有什么想法吗?
因此,对于自动布局,您可以根据每个不同的大小 UI 来设计应用 class。 OS 完成所有确定正在使用的设备以及应该使用什么尺寸的工作 class。但是,如果您有办法找出正在使用的设备。我不确定您是否可以决定使用什么大小 class,因为这又是由 OS.
动态处理的
获取正在使用的设备的代码:
NSString *device = [[UIDevice currentDevice]model ] ;
NSLog(@"%@",device);
截至 iOS 8 UIViewController 采用 UITraitEnvironment 协议。该协议声明了一个名为 traitCollection 的 属性,其类型为 UITraitCollection。因此,您只需使用 self.traitCollection
即可访问 traitCollection 属性
UITraitCollection 有两个您要访问的属性,名为 horizontalSizeClass 和 verticalSizeClass 访问这些属性 return 和 NSInteger。定义 returned 值的枚举在官方文档中声明如下- (这可能会在将来添加!)
typedef NS_ENUM (NSInteger, UIUserInterfaceSizeClass {
UIUserInterfaceSizeClassUnspecified = 0,
UIUserInterfaceSizeClassCompact = 1,
UIUserInterfaceSizeClassRegular = 2,
};
所以你可以获得 class 并使用一个开关来确定你的代码方向。一个例子可以是 -
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.
这很适合 testing/debugging:
let sizeClasses = ["Unspecified", "Compact", "Regular"]
print("SizeClass w:\(sizeClasses[traitCollection.horizontalSizeClass.rawValue]) h:\(sizeClasses[traitCollection.verticalSizeClass.rawValue])")
一些对 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")
}
Edit/Addition:
如果您尝试在 UIViewController
的生命周期早期访问特征集合,它们可能都是 UIUserInterfaceSizeClass.unspecified
。
如果您碰巧在代码中进行约束,这可能会很痛苦。
我建议从 UIScreen
共享对象访问 .traitCollection
。
UIScreen.main.traitCollection
或者更有用:
UIScreen.main.traitCollection.userInterfaceIdiom
你也可以像 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 class 依赖中使用,而且静态方法可以进入 Helper class。所以你可以在你的代码中的某个地方做:
let textSize:CGFloat = DeviceTraitStatus.current == .wRhR ? 18:14
我在 iOS 8 上使用自适应布局,我想准确了解 类 在 viewDidLoad
上的大小。对此有什么想法吗?
因此,对于自动布局,您可以根据每个不同的大小 UI 来设计应用 class。 OS 完成所有确定正在使用的设备以及应该使用什么尺寸的工作 class。但是,如果您有办法找出正在使用的设备。我不确定您是否可以决定使用什么大小 class,因为这又是由 OS.
动态处理的获取正在使用的设备的代码:
NSString *device = [[UIDevice currentDevice]model ] ;
NSLog(@"%@",device);
截至 iOS 8 UIViewController 采用 UITraitEnvironment 协议。该协议声明了一个名为 traitCollection 的 属性,其类型为 UITraitCollection。因此,您只需使用 self.traitCollection
UITraitCollection 有两个您要访问的属性,名为 horizontalSizeClass 和 verticalSizeClass 访问这些属性 return 和 NSInteger。定义 returned 值的枚举在官方文档中声明如下- (这可能会在将来添加!)
typedef NS_ENUM (NSInteger, UIUserInterfaceSizeClass {
UIUserInterfaceSizeClassUnspecified = 0,
UIUserInterfaceSizeClassCompact = 1,
UIUserInterfaceSizeClassRegular = 2,
};
所以你可以获得 class 并使用一个开关来确定你的代码方向。一个例子可以是 -
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.
这很适合 testing/debugging:
let sizeClasses = ["Unspecified", "Compact", "Regular"]
print("SizeClass w:\(sizeClasses[traitCollection.horizontalSizeClass.rawValue]) h:\(sizeClasses[traitCollection.verticalSizeClass.rawValue])")
一些对 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")
}
Edit/Addition:
如果您尝试在 UIViewController
的生命周期早期访问特征集合,它们可能都是 UIUserInterfaceSizeClass.unspecified
。
如果您碰巧在代码中进行约束,这可能会很痛苦。
我建议从 UIScreen
共享对象访问 .traitCollection
。
UIScreen.main.traitCollection
或者更有用:
UIScreen.main.traitCollection.userInterfaceIdiom
你也可以像 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 class 依赖中使用,而且静态方法可以进入 Helper class。所以你可以在你的代码中的某个地方做:
let textSize:CGFloat = DeviceTraitStatus.current == .wRhR ? 18:14