IOS 8でアダプティブレイアウトを使用していますが、viewDidLoad
のサイズクラスを正確に取得したいです。それについてのアイデアはありますか?
IOS 8以降IViewControllerはITraitEnvironmentプロトコルを採用しています。このプロトコルは、タイプITraitCollectionであるtraitCollectionという名前のプロパティを宣言します。そのため、self.traitCollection
を使用するだけでtraitCollectionプロパティにアクセスできます。
ITraitCollectionには、名前を指定してアクセスする2つのプロパティがあります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.
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
これは、テスト/デバッグに適しています。
let sizeClasses = ["Unspecified", "Compact", "Regular"]
print("SizeClass w:\(sizeClasses[traitCollection.horizontalSizeClass.rawValue]) h:\(sizeClasses[traitCollection.verticalSizeClass.rawValue])")
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