web-dev-qa-db-ja.com

iOS- viewDidLoadで現在のサイズクラスを検出

IOS 8でアダプティブレイアウトを使用していますが、viewDidLoadのサイズクラスを正確に取得したいです。それについてのアイデアはありますか?

33
user3193307

IOS 8以降IViewControllerITraitEnvironmentプロトコルを採用しています。このプロトコルは、タイプITraitCollectionであるtraitCollectionという名前のプロパティを宣言します。そのため、self.traitCollectionを使用するだけでtraitCollectionプロパティにアクセスできます。

ITraitCollectionには、名前を指定してアクセスする2つのプロパティがありますhorizo​​ntalSizeClassおよび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.
68
Bamsworld

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

コードで制約を行う場合、これは苦痛になる可能性があります。

.traitCollectionUIScreen共有オブジェクトから。

UIScreen.main.traitCollection

またはさらに便利:

UIScreen.main.traitCollection.userInterfaceIdiom
13
Jon Vogel

これは、テスト/デバッグに適しています。

let sizeClasses = ["Unspecified", "Compact", "Regular"]
print("SizeClass w:\(sizeClasses[traitCollection.horizontalSizeClass.rawValue]) h:\(sizeClasses[traitCollection.verticalSizeClass.rawValue])")
2
coco

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
0
Reimond Hill