设备界面方向

时间:2015-07-16 09:43:20

标签: ios objective-c uiinterfaceorientation

如何在应用启动时获取当前设备界面方向,即包含应用图标的主屏幕方向? 例如,iPad正在放置屏幕(UIDeviceOrientationFaceUp),其中包含我希望获得的横向界面方向(UIInterfaceOrientationLandscapeLeft)。在app启动时,所有界面功能都像

  • viewController.interfaceOrientation
  • [[uiApplication sharedApplication] statusBarOrientation]

提供错误的默认值UIInterfaceOrientationPortrait。有哪些可能的方式?

1 个答案:

答案 0 :(得分:1)

界面定位

在调用 didFinishLaunchingWithOptions之前,您可以获得有关方向的良好信息...

- (BOOL)application:(UIApplication *)application 
         willFinishLaunchingWithOptions:(NSDictionary *)launchOptions;

在这里,您可以查询UIScreen和UIApplication:

[UIScreen mainScreen].bounds
[UIApplication sharedApplication].statusBarOrientation

这些将根据启动应用程序时的操作系统状态为您提供正确的宽度,高度和interfaceOrientation。 (在任何情况下最好避免使用viewController.interfaceOrientation,因为它在iOS8中已被弃用。)

在你的问题中你建议statusBarOrientation不正确,但它在iPad mini / 8.3上对我来说很好。

设备定位

如果您对设备方向感兴趣,则需要开始侦听设备方向通知。您可以在视图控制器中的应用委托中执行此操作 - 无论哪种方式都不会影响您获取信息的时间,因为设备方向轮询需要一段时间才能启动。另外,如果你面朝上/面朝下,你得到的第一个设备方向回调可能是错误的:我认为它只是从界面方向获得提示。

这就是你开始倾听的方式:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] 
    addObserver: self 
       selector: @selector(deviceOrientationDidChange:) 
           name: UIDeviceOrientationDidChangeNotification 
         object: nil];

如果在第一次回调之前检查deviceOrientation ,它将被取消初始化,因此对您没什么用处。完成后你应该停止听,因为这个过程消耗额外的能量。

以下是启动序列中的一些日志,iPad正面向横向:

12:44:39.162 [AppDelegate application:willFinishLaunchingWithOptions:] 
{1024, 768} UIInterfaceOrientationLandscapeLeft / 0 UIDeviceOrientationUnknown / 0

12:44:39.165 [AppDelegate application:didFinishLaunchingWithOptions:] 
{1024, 768} UIInterfaceOrientationLandscapeLeft / 0 UIDeviceOrientationUnknown / 0

12:44:39.179 [ViewController viewDidLoad] 
{1024, 768} UIInterfaceOrientationLandscapeLeft / 0 UIDeviceOrientationUnknown / 0

12:44:39.180 [ViewController viewWillAppear:] 
{1024, 768} UIInterfaceOrientationLandscapeLeft / 0 UIDeviceOrientationUnknown / 0

12:44:39.186 [ViewController deviceOrientationDidChange:] 
{1024, 768} UIInterfaceOrientationLandscapeLeft / 0 UIDeviceOrientationLandscapeRight / 4

12:44:39.204 [ViewController viewDidAppear:] 
{1024, 768} UIInterfaceOrientationLandscapeLeft / 0 UIDeviceOrientationLandscapeRight / 4

12:44:39.249 [ViewController deviceOrientationDidChange:] 
{1024, 768} UIInterfaceOrientationLandscapeLeft / 0 UIDeviceOrientationFaceUp / 5

deviceOrientationDiDChange的第一个回调发生在启动后约35毫秒。如果设备平放,则第一次回调不正确 - 并且大约20ms后进行正确的回调。这些第一个deviceOrientation通知往往发生在第一个viewController上的viewWillAppearviewDidAppear之间(但这些事件不是相互关联的)。

对于比较,这是一个iPad正面朝纵向的创业公司:

12:44:01.741 [AppDelegate application:willFinishLaunchingWithOptions:] 
{768, 1024} UIInterfaceOrientationPortrait / 2 UIDeviceOrientationUnknown / 0

12:44:01.745 [AppDelegate application:didFinishLaunchingWithOptions:] 
{768, 1024} UIInterfaceOrientationPortrait / 2 UIDeviceOrientationUnknown / 0

12:44:01.758 [ViewController viewDidLoad] 
{768, 1024} UIInterfaceOrientationPortrait / 2 UIDeviceOrientationUnknown / 0

12:44:01.759 [ViewController viewWillAppear:] 
{768, 1024} UIInterfaceOrientationPortrait / 2 UIDeviceOrientationUnknown / 0

12:44:01.765 [ViewController deviceOrientationDidChange:] 
{768, 1024} UIInterfaceOrientationPortrait / 2 UIDeviceOrientationPortrait / 1

12:44:01.784 [ViewController deviceOrientationDidChange:] 
{768, 1024} UIInterfaceOrientationPortrait / 2 UIDeviceOrientationFaceUp / 5

12:44:01.828 [ViewController viewDidAppear:] 
{768, 1024} UIInterfaceOrientationPortrait / 2 UIDeviceOrientationFaceUp / 5

记录

[UIScreen mainScreen].bounds.size 
[UIApplication sharedApplication].statusBarOrientation
[UIDevice currentDevice].orientation

使用ENUM - > NSString次查找