如何处理 UIDeviceOrientationFaceUp 和 UIDeviceOrientationFaceDown?

Posted

技术标签:

【中文标题】如何处理 UIDeviceOrientationFaceUp 和 UIDeviceOrientationFaceDown?【英文标题】:how to deal with UIDeviceOrientationFaceUp and UIDeviceOrientationFaceDown? 【发布时间】:2010-12-12 18:36:26 【问题描述】:

这里是一个菜鸟问题。

我通过以下方式检测方向:

UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];

一切都很好,我根据报告的方向重新定位我的文本字段和标签

if (orientation == UIDeviceOrientationPortrait || orientation == UIDeviceOrientationPortraitUpsideDown)

and else 其他一切

我最近才发现的问题是UIDevice 报告UIDeviceOrientationFaceUpUIDeviceOrientationFaceDown。我该如何处理这种情况?我如何知道 UIDeviceOrientationFaceUpUIDeviceOrientationFaceDown 是在 Portrait 还是 Landscape 中发生?我知道设备是朝上还是朝下,但我不知道是否应该将所有内容重新定位为纵向或横向。

谢谢!

【问题讨论】:

【参考方案1】:

Apple 建议不要将 device 方向用于视图布局。相反,每个视图控制器都有一个interfaceOrientation 属性,UIApplication 有一个statusBarOrientation 属性,两者都会返回当前的界面方向,适合视图布局。

为了监视更改,当界面方向发生更改时,将调用 willRotateToInterfaceOrientation:duration: 等 UIViewController 方法,并发布 UIApplicationWillChangeStatusBarOrientationNotification 等通知。

【讨论】:

这是正确的答案,只是重构 UIDevice 方向响应(正如博客所建议的那样)不如听 UIViewController 的 interfaceOrientation。干得好。 我也更喜欢这个答案。 caprica13,你能把这个标记为正确吗? 在某些情况下,需要根据设备方向而不是 UI 方向来布局视图。例如,查看本机相机应用程序或 Instagram 的相机屏幕 - 容器在 UI 方向上保持固定,而图标随着设备方向旋转。【参考方案2】:

有点晚了,希望对大家有所帮助。

对于 ios 6.0 及更高版本:

1) 在查看设置期间设置此代码以接收轮播通知:

  // Set Listener to receive orientation notifications from the device
  [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(detectOrientation)
                                               name:UIDeviceOrientationDidChangeNotification
                                             object:nil];

2) 设置此代码以在旋转后捕获通知:

-(void)detectOrientation      
  switch ([[UIDevice currentDevice] orientation]) 
    case UIDeviceOrientationFaceDown:
      NSLog(@"UIDeviceOrientationFaceDown");
      break;
    
    case UIDeviceOrientationFaceUp:
      NSLog(@"UIDeviceOrientationFaceUp");
      break;
    
    case UIDeviceOrientationLandscapeLeft:
      NSLog(@"UIDeviceOrientationLandscapeLeft");
      break;
    
    case UIDeviceOrientationLandscapeRight:
      NSLog(@"UIDeviceOrientationLandscapeRight");
      break;
    
    case UIDeviceOrientationPortrait:
      NSLog(@"UIDeviceOrientationPortrait");
      break;
    
    case UIDeviceOrientationPortraitUpsideDown:
      NSLog(@"UIDeviceOrientationPortraitUpsideDown");
      break;
    
    case UIDeviceOrientationUnknown:
      NSLog(@"UIDeviceOrientationUnknown");
      break;
    
    default:
      break;
    
  


【讨论】:

【参考方案3】:

我也有同样的问题

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

此方法为 7 种可能的设备位置状态生成通知:

UIDeviceOrientationPortrait
UIDeviceOrientationPortraitUpsideDown
UIDeviceOrientationLandscapeLeft
UIDeviceOrientationLandscapeRight
UIDeviceOrientationFaceUp
UIDeviceOrientationFaceDown
UIDeviceOrientationUnknown

但我只需要前 4 个,这是我解决此问题的方法(包含代码): How to handle UIDeviceOrientation for manage views layouts

【讨论】:

以上是关于如何处理 UIDeviceOrientationFaceUp 和 UIDeviceOrientationFaceDown?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 UsernameNotFoundException 春季安全

如何处理c#中的错误代码

Akka 如何处理消息版本?

开玩笑测试 - 如何处理 JsonWebToken 响应

如何处理 JSON 响应

“不知道如何处理' nvcc 致命错误