在iPad上确定UIInterfaceOrientation

时间:2010-04-10 17:41:37

标签: iphone ipad orientation

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

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

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

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

10 个答案:

答案 0 :(得分:77)

您是否了解interfaceOrientation类的UIViewController属性?

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

或者你在[[UIDevice currentDevice] orientation]之后?

答案 1 :(得分:40)

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

[UIApplication sharedApplication].statusBarOrientation

答案 2 :(得分:10)

在某些情况下,

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

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

答案 3 :(得分:4)

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

if ((orientation == UIInterfaceOrientationLandscapeLeft)
||  (orientation == UIInterfaceOrientationLandscapeRight) )
{
    //Landscape
}
else
{
    //Portrait
}

答案 4 :(得分:1)

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

答案 5 :(得分: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上......(我得到了)

答案 6 :(得分:1)

将它混合一点:

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

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:1)

我已经通过@slycrel投了答案,但我想花时间写这篇文章,并指出一些似乎在这个老问题中丢失的东西,以及关于这个问题的许多其他问题。 / p>

Apple确实不希望我们根据方向更改来更新我们的大多数UI,但它仍然完全有可能,有时候需要根据具体情况进行更新,直到Apple改进他们的新功能(ish)API(例如viewWillTransitionToFrame:viewWillTransitionToSize:更有用。只是说'

为什么我通过@slycrel投票给你的答案与UIDeviceOrientationUIInterfaceOrientation之间的逻辑差异需要牢记在一起。

状态栏表示应用程序当前已知的UIInterfaceOrientation。关于FaceUpFaceDown的所有这些内容仅与设备的方向相关,而不一定与您的应用程序相关。 应用程序无论如何都不支持设备方向。实际上,UIDeviceOrientation可以完全忽略,如果您只需要确保在界面中适当地布局和动画,这是应用程序开发人员用例的99%。目前,这是通过来自@ slycrel的答案的状态栏UIInterfaceOrientation来实现的:

[UIApplication sharedApplication].statusBarOrientation

应该注意,此属性的 readwrite 版本已弃用, readonly 版本不推荐使用。

举个例子:

  • 我有一个支持所有接口方向的应用程序,以及支持它们的根视图控制器。
  • 现在,我正在展示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;

答案 9 :(得分:0)

自iOS8起,API已被弃用或返回无用的结果,例如.FaceUp .FaceDown

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

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