DeviceOrientation против ScreenSize vs StatusBar.isLandscape?
IOS, 11, 4 и Свифт Xcode 9.X
Независимо от того, с помощью AutoLayout или нет, Есть несколько способов, чтобы получить правильную ориентацию устройства, и они могут быть использованы для обнаружения изменений вращения при использовании приложение, а также получить правильную ориентацию при запуске приложения или после возобновления с фона.
Это решение прекрасно работают в прошивкой 11 и Xcode 9.X
1. UIScreen.main.bounds.size: Если вы хотите узнать, находится ли приложение в альбомном или портретном режиме, наилучшим началом для начала является viewDidLoad
в rootViewController
во время запуска и в viewWillTransition(toSize:)
в rootViewController
, если вы хотите обнаружить изменения вращения во время приложения. находится в фоновом режиме и должен возобновить пользовательский интерфейс в правильной ориентации.
let size = UIScreen.main.bounds.size
if size.width < size.height {
print("Portrait: \(size.width) X \(size.height)")
} else {
print("Landscape: \(size.width) X \(size.height)")
}
Это также происходит в начале жизненного цикла приложения/viewController.
2. NotificationCenter
Если вам нужно, чтобы получить фактическую ориентацию устройства (в том числе ничком, лицом вверх, и т.д.). Вы хотите добавить наблюдатель следующим образом (даже если вы делаете это в методе application:didFinishLaunchingWithOptions
в AppDelegate
, первые уведомления, вероятно, будут запущены после того, как viewDidLoad
выполняются
device = UIDevice.current
device?.beginGeneratingDeviceOrientationNotifications()
notificationCenter = Notifi`enter code here`cationCenter.default
notificationCenter?.addObserver(self, selector: #selector(deviceOrientationChanged),
name: Notification.Name("UIDeviceOrientationDidChangeNotification"),
object: nil)
И добавить селектор следующим образом. Я разделил это в 2-х частей, чтобы иметь возможность запускать inspectDeviceOrientation()
в viewWillTransition
@objc func deviceOrientationChanged() {
print("Orientation changed")
inspectDeviceOrientation()
}
func inspectDeviceOrientation() {
let orientation = UIDevice.current.orientation
switch UIDevice.current.orientation {
case .portrait:
print("portrait")
case .landscapeLeft:
print("landscapeLeft")
case .landscapeRight:
print("landscapeRight")
case .portraitUpsideDown:
print("portraitUpsideDown")
case .faceUp:
print("faceUp")
case .faceDown:
print("faceDown")
default: // .unknown
print("unknown")
}
if orientation.isPortrait { print("isPortrait") }
if orientation.isLandscape { print("isLandscape") }
if orientation.isFlat { print("isFlat") }
}
Обратите внимание, что UIDeviceOrientationDidChangeNotification
может быть размещен в несколько раз во время запуска, а в некоторых случаях это может быть .unknown
. то, что я видел, что первая правильная орь Уведомление ентация принимается после viewDidLoad
и viewWillAppear
методов, и прямо перед viewDidAppear
или даже applicationDidBecomeActive
объект ориентации даст вам все 7 возможных сценариев (от enum UIDeviceOrientation
определения):
public enum UIDeviceOrientation : Int {
case unknown
case portrait // Device oriented vertically, home button on the bottom
case portraitUpsideDown // Device oriented vertically, home button on the top
case landscapeLeft // Device oriented horizontally, home button on the right
case landscapeRight // Device oriented horizontally, home button on the left
case faceUp // Device oriented flat, face up
case faceDown // Device oriented flat, face down
}
Интересно, что isPortrait
только для чтения Bool
переменная определена в расширении, чтобы UIDeviceOrientation
следующим образом:
extension UIDeviceOrientation {
public var isLandscape: Bool { get }
public var isPortrait: Bool { get }
public var isFlat: Bool { get }
public var isValidInterfaceOrientation: Bool { get }
}
3. StatusBarOrientation
UIApplication.shared.statusBarOrientation.isLandscape
Это прекрасно работает, чтобы определить, является ли ориентация портрет или альбомной ориентации и дает те же результаты, как точка 1. Вы можете оценить его в viewDidLoad
(для запуска приложения) и в viewWillTransition(toSize:)
если исходит из фона. Но это не даст вам информацию о верхнем/нижнем, левом/правом, вверх/вниз, которые вы получаете с уведомлениями (пункт 2)
ваше приложение поддерживает только одну ориентацию? – aaisataev
Приложение поддерживает как портрет, так и пейзаж. Я помещаю устройство в альбомный режим, первая строка возвращает false. Если я вращаюсь, он начинает возвращать правильное значение. –
interfaceOrientation и deviceOrientation - это две разные вещи. Используйте 'UIDeviceOrientationDidChangeNotification', чтобы получить уведомление, когда ориентация устройства изменится – san