确定iPad上的UIInterfaceOrientation

我不需要在这种情况下指定方向,我只需要检测它,但我遇到了麻烦。 我有条件代码,只能在肖像工作,如果设备在横向我需要做别的。 由于deviceOrientation不一定与interfaceOrientation相同,所以我不能想出一种testing纵向模式的方法。

我在Google上find的大多数教程都是强制执行景观或进行某种旋转的方法。 我唯一想做的就是确定方向是什么。 这是我的代码,这是不工作的:

-(void)viewDidLoad { [super viewDidLoad]; //currentOrientation is declared as UIInterfaceOrientation currentOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation]; NSLog(@"%@",currentOrientation); // == NULL } 

我需要有条件地确定interfaceOrientation和program的值。 谢谢你的帮助!

你知道UIViewController类的interfaceOrientation属性吗?

 - (void) viewDidLoad { [super viewDidLoad]; BOOL isPortrait = UIDeviceOrientationIsPortrait(self.interfaceOrientation); // now do whatever you need } 

还是你在[[UIDevice currentDevice] orientation]

特别是在发布时,我发现以下内容对于UI总是准确的,无论UIDevice说什么方向。

 [UIApplication sharedApplication].statusBarOrientation 

self.interfaceOrientation在某些情况下是不可靠的。 例如,重新排列tabbar应用程序中的选项卡将返回不正确的值。

但是[UIApplication sharedApplication].statusBarOrientation总是可靠的。 你为我节省了很多时间。 谢谢。

 UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight) ) { //Landscape } else { //Portrait } 

我知道这是一个很老的post。 如何添加一个点说,最好是检查状态栏的方向是更好的。 当你调用self.interfaceorientation它每次都调用shouldRotateToOrientation 。 如果你在这个方法中写了一些代码,它将被执行。 所以要谨慎!

  UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation; if(deviceOrientation == UIDeviceOrientationFaceUp || deviceOrientation == UIDeviceOrientationFaceDown){ if(debug){ NSLog(@"Nothing to change because it is gone to Flat"); } return; } if(deviceOrientation !=statusBarOrientation){ if(debug){ NSLog(@"\nApple has a bug?:\n UIDeviceOrientation : %d, UIInterfaceOrientation: %d",deviceOrientation, statusBarOrientation ); } } 

你将不会相信我,直到你将在控制台看到第二个输出! 有些情况 – 它们存在! – 显示最后的NSLog内容!

比你必须做的一些解决方法,这样的方式,iOS没有错误,祝大家好运!

啊…论坛版主也许会删除这篇文章,因为这并不意味着在他的意见和答案!

我希望它有助于一次,它也发生在iPhone上…(我得到了)

把它混合一点:

 BOOL isLandscape = self.view.frame.size.width > self.view.frame.size.height; 

(编辑)显然以前的答案是正确的方法来做到这一点,这种解决scheme将失败的情况下视图控制器不全屏。

 -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{</br> if (UIDeviceOrientationIsLandscape(toInterfaceOrientation)) {</br> some instructions; } else { some instructions; } } 

这是我的一个程序的一个片段。 你当然也可以在你的ViewDidLoad通知中使用if语句。

从iOS8开始,API已被弃用或返回无用的结果,如.FaceUp .FaceDown

这是因为Apple不希望使用方向更新UI,而是使用大小类别,约束和比例(使用超级视图的n%)。

事实上,取决于方向的代码可能无法在整个设备和用例范围内提供良好的结果(尤其是多任务处理)

我已经投了@slycrel的答案,但我想花点时间写这个,并指出一些似乎在这个老问题上丢失的东西,还有很多关于这个问题的其他问题。

确实,苹果公司并不真的希望我们根据方向的变化来更新我们的大部分用户界面,但是在一个个案的情况下,它仍然是完全可能的,有时也是必要的,直到苹果改进他们的新的(ish) API(比如viewWillTransitionToFrame:viewWillTransitionToSize:更有用)。

为什么我把@slycrel的答案投给了你所需要记住的UIDeviceOrientationUIInterfaceOrientation之间的逻辑差异。

状态栏是指应用程序当前已知的UIInterfaceOrientation 。 所有关于FaceUp东西, FaceDown只与设备的方向有关,不一定是你的应用程序的。 无论如何,应用程序不支持设备方向 。 真的, UIDeviceOrientation可以完全忽略,如果你所要做的就是确保你的界面布局和animation适当,这是99%的应用程序开发者的用例。 这是目前通过@ slycrel的回答在状态栏的UIInterfaceOrientation中实现的:

 [UIApplication sharedApplication].statusBarOrientation 

应该注意的是,这个属性的readwrite版本已经被弃用了, 只读版本不是。

以这个例子:

  • 我有一个支持所有接口方向的应用程序,以及一个支持它们的根视图控制器。
  • 现在,我正在呈现一个UIViewController ,它将导致状态栏方向变成横向。
  • 哪个风景方向(向左或向右)是基于preferredInterfaceOrientationForPresentation为该视图控制器返回的内容,当前设备的方向是什么以及视图控制器支持的接口方向(见下一点)。
  • 无论当前的设备方向是什么,状态栏都将进入横向模式,因为此视图控制器仅支持基于supportedInterfaceOrientations返回内容的横向模式。 比方说,我们支持UIInterfaceOrientationMaskLandscape左右两个景观。
  • 我也想有条件的animation这个视图控制器的位置与旋转变换 。 这只是从肖像或肖像倒过来,左转左或右转。 否则,这将是一个更简单的演示animation,无需旋转。
  • 然后,经过一段时间和设备的使用,我解雇了视图控制器。
  • 现在我想有条件地使用另一个旋转变换来使这个视图控制器离开屏幕 。 只有从左侧风景或右侧风景转到纵向或纵向时才有必要。 否则,这将是一个更简单的解雇animation没有旋转。
  • 此时,根据您的根视图控制器的首选接口方向和支持的接口方向以及设备当前的UIDeviceOrientation ,状态栏的方向将变为系统所决定的适当方向。
  • 由于视图控制器我们将支持所有的界面方向,如果你的设备的方向是FaceUp或FaceDown, 你不能可靠地猜测基于UIDeviceOrientation的下UIInterfaceOrientation UIInterfaceOrientation,你不必这样做。
  • 所以…状态栏方向救援!

前面的例子是可能的,因为当视图控制器转换即将开始时(系统询问animation师的转换委托等),状态栏方向不被更新。 然后在转换开始animation时更新(例如,在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;