我已经对@slycrel 的答案投了赞成票,但我想花时间写这篇文章,并指出一些似乎在这个老问题中丢失的东西,以及关于这个主题的许多其他问题。
确实,Apple 并不真正希望我们根据方向更改来更新我们的大部分 UI,但在逐案情况下,这仍然是完全可能的,有时甚至是必要的,直到 Apple 改进他们的新(ish) API(例如viewWillTransitionToFrame:
会比 . 更有用viewWillTransitionToSize:
。只是说')
为什么我对@slycrel 的答案投了赞成票与您需要记住的和之间的逻辑区别UIDeviceOrientation
有关UIInterfaceOrientation
。
状态栏是表示应用程序当前已知的UIInterfaceOrientation
。所有这些关于FaceUp
,FaceDown
只与设备的方向有关,不一定与您的应用程序有关。无论如何,应用程序都不支持设备方向。真的,UIDeviceOrientation
如果您所要做的就是确保在界面中适当地布局和动画,那么可以完全忽略,这是应用程序开发人员用例的 99%。这目前是通过UIInterfaceOrientation
@slycrel 回答中的状态栏实现的:
[UIApplication sharedApplication].statusBarOrientation
需要注意的是,该属性的读写版本已被弃用,只读版本不被弃用。
举个例子:
- 我有一个支持所有界面方向的应用程序,以及一个支持它们的根视图控制器。
- 现在,我将展示一个
UIViewController
将导致状态栏方向变为横向的方法。
- 它转到哪个横向(左或右)取决于
preferredInterfaceOrientationForPresentation
该视图控制器返回的内容、当前设备方向以及视图控制器支持的界面方向(请参阅下一点)。
- 无论当前设备方向是什么,状态栏都会变为横向,因为此视图控制器仅支持基于
supportedInterfaceOrientations
. 假设我们支持左右横向UIInterfaceOrientationMaskLandscape
。
- 我还想通过旋转变换有条件地将此视图控制器设置为动画。这仅在从纵向或纵向颠倒到横向左侧或横向右侧时才需要。否则它将是一个更简单的没有旋转的演示动画。
- 然后,经过一段时间和设备使用后,我关闭了该视图控制器。
- 现在我想用另一个旋转变换有条件地使这个视图控制器离开屏幕。仅当从横向左侧或横向右侧变为纵向或纵向颠倒时,才需要这样做。否则它将是一个更简单的没有旋转的解雇动画。
- 此时,状态栏的方向将成为系统决定适合您的根视图控制器的首选界面方向和支持的界面方向以及设备当前的
UIDeviceOrientation
.
- 由于我们将要支持所有界面方向的视图控制器,如果您的设备的方向是 FaceUp 或 FaceDown,您无法可靠地猜测下一个
UIInterfaceOrientation
基于UIDeviceOrientation
,而且您也不必这样做。
- 所以...状态栏方向来救援!
前面的示例是可能的,因为当视图控制器转换即将开始时状态栏方向不会更新(系统向转换委托询问动画师等)。然后在过渡开始动画时更新它(例如,在animationTransition:
调用时)。这样,您应该只需使用状态栏的初始值和当前值就可以进行很好的比较UIInterfaceOrientation
。
即使不使用视图控制器转换,根据状态栏方向更新视图仍然应该是安全的。
请记住,如果您手动更新状态栏,并且您没有在 Info.plist 中使用“查看基于控制器的状态栏外观”,那么您的应用程序的逻辑必须知道状态栏何时会改变方向并且确实改变方向. NSNotification
您可能会为这些案例寻找几个名称,它们是:
UIApplicationWillChangeStatusBarOrientationNotification
UIApplicationDidChangeStatusBarOrientationNotification
以及这些UIApplicationDelegate
方法:
- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation;
- (UIInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window
还有这个其他有用的UIApplication
属性:
@property(nonatomic,readonly) NSTimeInterval statusBarOrientationAnimationDuration;