如何处理 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
报告UIDeviceOrientationFaceUp
或UIDeviceOrientationFaceDown
。我该如何处理这种情况?我如何知道 UIDeviceOrientationFaceUp
和 UIDeviceOrientationFaceDown
是在 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?的主要内容,如果未能解决你的问题,请参考以下文章