【问题标题】:Getting the device interface orientation in viewWillAppear在 viewWillAppear 中获取设备界面方向
【发布时间】:2012-07-04 17:45:33
【问题描述】:

我需要在 UIViewController 的 viewWillAppear 方法中获取界面方向。我所做的是:

if (self.interfaceOrientation == UIInterfaceOrientationPortrait)
   NSLog(@"Portrait");
else
   NSLog(@"Landscape");

在横向时,我总是在 viewWillAppear 中获得纵向,在 viewDidAppear 中获得横向。为什么?

所以,我尝试使用 [[UIApplication sharedApplication] statusBarOrientation],但同样的情况发生了。我还尝试了 Stack Overflow 中发布的另一种解决方案:

UIDevice* device = [UIDevice currentDevice];
[device beginGeneratingDeviceOrientationNotifications];
UIDeviceOrientation currentOrientation = device.orientation;
[device endGeneratingDeviceOrientationNotifications];

这似乎正确地返回了方向,但现在我留下了将 UIDeviceOrientation 映射到 UIInterfaceOrientation 的问题,据我所知这是不可能的(无法映射面朝上和面朝下)。

这个问题有什么解决办法吗?

【问题讨论】:

  • 如果您可以支持 iOS 5+,最好在 -viewWillLayoutSubviews 方法中完成这项工作。如果您的应用刚刚完成加载,则可能会在设置视图框架并且窗口已完成自身定向之前调用 -viewWillAppear。如果你在 iOS 4 中需要这些信息,你真的需要等待 -viewDidAppear 被调用。
  • 如果你使用的是导航控制器,那么在 viewWillAppear 中检查 self.navigationController.interfaceOrientation 怎么样?
  • @JasonCoco 这对我来说非常适合。找到适用于 iOS4 的解决方案也会很有趣,但这很好。
  • @AntonHolmquist 也试过了,忘了说。我仍然总是肖像。你不是吗?
  • @JasonCoco 如果您使用评论中提供的信息回答问题,我会将其标记为已接受。这是迄今为止提供的唯一可行选项。

标签: ios uiviewcontroller uiinterfaceorientation


【解决方案1】:

改用 [UIApplication sharedApplication].statusBarOrientation。

if([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait || [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown) {
    // Portrait
}
if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft || [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight){
    // Landscape
}

【讨论】:

  • 正如我所说,我试过这个。总是得到肖像。这对你有用吗?
【解决方案2】:

JasonCoco 的第一条评论是我发现这个问题的最佳解决方案。

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多