IOS - определение классов текущего размера в viewDidLoad

Я работаю с адаптивной компоновкой на iOS 8, и я хочу получить именно то, что классы размера находятся на viewDidLoad. Любые идеи об этом?

Ответ 1

В iOS 8 UIViewController используется протокол 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.

Ответ 2

Некоторые полезные вещи для 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

Ответ 3

Это хорошо для тестирования/отладки:

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

Ответ 4

Вы также можете сделать это в 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, но и статический метод может входить в класс ie Helper. Так что вы можете сделать где-нибудь в своем коде:

let textSize:CGFloat = DeviceTraitStatus.current == .wRhR ? 18:14

Ответ 5

Итак, для Auto Layout вы создаете пользовательский интерфейс приложений для каждого класса разного размера. ОС выполняет всю работу по выяснению используемого устройства и того, какой класс класса следует использовать. Однако, если у вас есть способ выяснить, какое устройство используется. Я не уверен, можете ли вы решить, какой класс размера будет использоваться, поскольку, опять же, это динамически обрабатывается ОС.

Код для использования устройства:

NSString *device = [[UIDevice currentDevice]model ] ;
NSLog(@"%@",device);