35

在这种情况下我不需要指定方向,我只需要检测它,但我遇到了麻烦。我有条件代码只能在纵向工作,如果设备是横向的,我需要做其他事情。由于 deviceOrientation 不一定与 interfaceOrientation 相同,因此我无法想出测试纵向模式的方法。

我在 Google 上找到的大多数教程都是强制横向或进行某种旋转的方法。我唯一想做的就是确定方向是什么。这是我的代码,它不起作用:

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

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

4

10 回答 10

77

你知道类的interfaceOrientation属性UIViewController吗?

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

还是你追求[[UIDevice currentDevice] orientation]

于 2010-04-10T18:01:19.970 回答
41

尤其是在启动时,我发现以下对于 UI 始终是准确的,无论 UIDevice 说的方向是什么。

[UIApplication sharedApplication].statusBarOrientation
于 2010-05-21T18:15:33.947 回答
10

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

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

于 2011-04-01T02:56:04.730 回答
4
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

if ((orientation == UIInterfaceOrientationLandscapeLeft)
||  (orientation == UIInterfaceOrientationLandscapeRight) )
{
    //Landscape
}
else
{
    //Portrait
}
于 2012-01-12T12:27:39.180 回答
1
    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 上......(我得到了)

于 2012-08-24T16:04:09.570 回答
1

我知道这是一个非常古老的帖子。我想补充一点说检查状态栏方向更好。当你打电话self.interfaceorientation时,它shouldRotateToOrientation每次都在打电话。如果您在该方法中编写了一些代码,它将被执行。所以要小心!

于 2012-03-12T08:11:01.370 回答
1
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{</br>
   if (UIDeviceOrientationIsLandscape(toInterfaceOrientation)) {</br>
        some instructions;
   } else { 
        some instructions;
   }
}

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

于 2014-09-16T19:51:18.010 回答
1

稍微混合一下:

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

(编辑)显然,先前的答案是正确的方法,并且在视图控制器不是全屏的情况下,此解决方案将失败。

于 2014-04-30T21:56:06.113 回答
1

我已经对@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;
于 2016-07-11T00:24:41.697 回答
0

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

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

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

于 2015-09-30T08:15:42.653 回答