Я работаю с адаптивной компоновкой на iOS 8, и я хочу получить именно то, что классы размера находятся на viewDidLoad
. Любые идеи об этом?
IOS - определение классов текущего размера в 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);