Выполнить pytest
как модуль с: python -m pytest tests
У меня возникли проблемы с использованием 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 и более поздних версий.
вы можете использовать:
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 UPDATE
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 и более поздних версий
blockquote>
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 answer: вот как я это делаю,
1.works для всех видов контроллера вида
2. также работает, когда пользователь поворачивает приложение
3.также в первый раз установите приложение
Swift 4:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.current.orientation.isLandscape {
print("landscape")
} else {
print("portrait")
}
}
Swift 3, основанный на ответе Роба
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if (size.width / size.height > 1) {
print("landscape")
} else {
print("portrait")
}
}
Чтобы получить строку состояния (и, следовательно, UI), такую как код Objective-C, вы просто:
UIApplication.sharedApplication().statusBarOrientation
Вы также можете использовать свойство orientation
UIDevice:
UIDevice.currentDevice().orientation
Однако это может не совпадать с ориентацией вашего пользовательского интерфейса. Из документов:
Значение свойства является константой что указывает на текущую ориентацию устройства. Это значение представляет физическую ориентацию устройства и может отличаться от текущей ориентации пользовательского интерфейса вашего приложения. См. «UIDeviceOrientation» для описания возможных значений.
blockquote>
Итак, если 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, равна ширине и высоте.)
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
if (toInterfaceOrientation.isLandscape) {
NSLog("Landscape");
}
else {
NSLog("Portrait");
}
}
Чтобы найти текущую ориентацию устройства, просто используйте этот код:
UIApplication.sharedApplication (). statusBarOrientation
blockquote>для swift 3.0
UIApplication.shared.statusBarOrientation
blockquote>
Apple недавно избавилась от идеи «Ландшафт против портрета» и предпочитает использовать размер экрана. Однако это работает:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("landscape")
} else {
print("portrait")
}
}