Получение ориентации устройства в Swift
Мне было интересно, как я могу получить текущую ориентацию устройства в Swift? Я знаю, что есть примеры для Objective-C, но я не смог заставить его работать в Swift.
Я пытаюсь получить ориентацию устройства и помещать его в оператор if.
Это строка, с которой у меня больше всего проблем:
[[UIApplication sharedApplication] statusBarOrientation]
Ответы
Ответ 1
вы можете использовать:
override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) {
var text=""
switch UIDevice.currentDevice().orientation{
case .Portrait:
text="Portrait"
case .PortraitUpsideDown:
text="PortraitUpsideDown"
case .LandscapeLeft:
text="LandscapeLeft"
case .LandscapeRight:
text="LandscapeRight"
default:
text="Another"
}
NSLog("You have moved: \(text)")
}
ОБНОВЛЕНИЕ SWIFT 3
override func didRotate(from fromInterfaceOrientation: UIInterfaceOrientation) {
var text=""
switch UIDevice.current.orientation{
case .portrait:
text="Portrait"
case .portraitUpsideDown:
text="PortraitUpsideDown"
case .landscapeLeft:
text="LandscapeLeft"
case .landscapeRight:
text="LandscapeRight"
default:
text="Another"
}
NSLog("You have moved: \(text)")
}
или
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
}
с уведомлением вы можете проверить: IOS8 Swift: как определить изменение ориентации?
ПРИМЕЧАНИЕ. didRotateFromInterfaceOrientation устарела. viewWillTransitionToSize для iOS 2.0 и более поздних версий
Ответ 2
Чтобы получить строку состояния (и, следовательно, UI), такую как код Objective-C, вы просто:
UIApplication.sharedApplication().statusBarOrientation
Вы также можете использовать свойство orientation
UIDevice:
UIDevice.currentDevice().orientation
Однако это может не совпадать с ориентацией вашего пользовательского интерфейса. Из документов:
Значение свойства - это константа, указывающая текущий ориентация устройства. Это значение представляет физическое ориентации устройства и может отличаться от текущего ориентация пользовательского интерфейса ваших приложений. Видеть "UIDeviceOrientation" для описания возможных значений.
Ответ 3
Недавно Apple избавилась от идеи "Ландшафт против портрета" и предпочитает использовать размер экрана. Однако это работает:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("landscape")
} else {
print("portrait")
}
}
Ответ 4
Чтобы найти текущую ориентацию устройства, просто используйте этот код:
UIApplication.sharedApplication(). StatusBarOrientation
для быстрого 3.0
UIApplication.shared.statusBarOrientation
Ответ 5
У меня были проблемы с использованием InterfaceOrientation
, он работал нормально, за исключением того, что он не обращался к ориентации при загрузке. Поэтому я попробовал это, и это хранитель. Это работает, потому что bounds.width
всегда относится к текущей ориентации, а не к nativeBounds.width
, которая является абсолютной.
if UIScreen.mainScreen().bounds.height > UIScreen.mainScreen().bounds.width {
// do your portrait stuff
} else { // in landscape
// do your landscape stuff
}
Я называю это от willRotateToInterfaceOrientation(toInterfaceOrientation:
UIInterfaceOrientation, duration: NSTimeInterval)
и от viewDidLoad
, но он гибкий.
Благодаря zSprawl для указателя в этом направлении. Я должен отметить, что это хорошо только для iOS 8 и более поздних версий.
Ответ 6
struct DeviceInfo {
struct Orientation {
// indicate current device is in the LandScape orientation
static var isLandscape: Bool {
get {
return UIDevice.current.orientation.isValidInterfaceOrientation
? UIDevice.current.orientation.isLandscape
: UIApplication.shared.statusBarOrientation.isLandscape
}
}
// indicate current device is in the Portrait orientation
static var isPortrait: Bool {
get {
return UIDevice.current.orientation.isValidInterfaceOrientation
? UIDevice.current.orientation.isPortrait
: UIApplication.shared.statusBarOrientation.isPortrait
}
}
}}
swift4 ответ:
вот как я это делаю,
1.works для всех видов контроллера вида
2. Также работайте, когда пользователь поворачивает приложение
3.также в первый раз установите приложение
Ответ 7
Итак, если Apple обесценивает всю ориентировочную строку ( "портрет", "пейзаж" ), тогда вам все равно будет отношение ширины к высоте. (вроде как @bpedit ответ)
Если вы разделите ширину на высоту, если результат меньше 1, то mainScreen или контейнер или что-то еще находится в режиме "портрет". Если результат больше 1, это "пейзажная" живопись.;)
override func viewWillAppear(animated: Bool) {
let size: CGSize = UIScreen.mainScreen().bounds.size
if size.width / size.height > 1 {
print("landscape")
} else {
print("portrait")
}
}
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if size.width / size.height > 1 {
print("landscape")
} else {
print("portrait")
}
}
(Я предполагаю, что если вы используете этот подход, то вам, вероятно, не важно, как конкретно обрабатывать условие, когда отношение равно ровно 1, равна ширине и высоте.)
Ответ 8
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
if (toInterfaceOrientation.isLandscape) {
NSLog("Landscape");
}
else {
NSLog("Portrait");
}
}
Ответ 9
Swift 3, на основе ответа Роба
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if (size.width / size.height > 1) {
print("landscape")
} else {
print("portrait")
}
}
Ответ 10
Swift 4:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.current.orientation.isLandscape {
print("landscape")
} else {
print("portrait")
}
}