statusBarOrientation 何时与 UIDeviceOrientation 不同?

When is statusBarOrientation different from UIDeviceOrientation?

以下代码中的断言何时触发?

let orien = UIApplication.shared.statusBarOrientation

UIDevice.current.beginGeneratingDeviceOrientationNotifications()

switch UIDevice.current.orientation {
case .portrait: assert(orien == .portrait)
case .portraitUpsideDown: assert(orien == .portraitUpsideDown)
case .landscapeLeft: assert(orien == .landscapeRight)
case .landscapeRight: assert(orien == .landscapeLeft)
default: return
}

当您的应用程序不支持所有四种方向时。 UIDeviceOrientation 反映设备的方向,与您的应用程序是否支持该方向无关。 statusBarOrientation 将始终是您支持的方向之一。

因此,例如,如果您的设备纵向倒置,但您的应用不支持该方向,则 UIDeviceOrientation 将为 portraitUpsideDown,但 statusBarOrientation 将为 landscapeLeft(如果这是设备之前的方向)将肖像颠倒)。

请注意 iPhone 上的旋转锁定不会触发上述断言 — statusBarOrientation 和 UIDeviceOrientation 均报告为纵向,与实际方向无关,但它们彼此一致。