设备界面方向
Device interface orientation
如何在应用程序启动时获取当前设备界面方向,即包含应用程序图标的主屏幕方向?
例如,iPad 正在以横向界面方向 (UIInterfaceOrientationLandscapeLeft
) 放置屏幕 (UIDeviceOrientationFaceUp
),这是我想要得到的。在应用程序启动时,所有界面功能如
viewController.interfaceOrientation
[[uiApplication sharedApplication] statusBarOrientation]
给出错误的默认值 UIInterfaceOrientationPortrait
。有哪些可能的方式?
界面方向
在 didFinishLaunchingWithOptions
被称为...
之前,您可以获得有关方向的有用信息
- (BOOL)application:(UIApplication *)application
willFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
这里可以查询UIScreen和UIApplication:
[UIScreen mainScreen].bounds
[UIApplication sharedApplication].statusBarOrientation
这些将根据应用程序启动时的 OS 状态为您提供正确的宽度、高度和界面方向。 (在任何情况下最好避免使用 viewController.interfaceOrientation
,因为它在 iOS8 中已弃用。)
在你的问题中,你认为 statusBarOrientation 不正确,但它在 iPad mini / 8.3 上对我来说工作正常。
设备方向
如果您对设备方向感兴趣,则需要开始侦听设备方向通知。您可以在视图控制器中的应用程序委托中执行此操作 - 无论哪种方式都不会影响您获取信息的时间,因为设备方向轮询需要时间来启动。此外,如果您面朝上/面朝下,您获得的 first 设备方向回调可能是错误的:我认为它只是从界面方向中获取提示。
这就是您开始聆听的方式:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(deviceOrientationDidChange:)
name: UIDeviceOrientationDidChangeNotification
object: nil];
如果您在第一次回调之前检查设备方向,它将未初始化,因此对您没有多大用处。完成后您应该停止收听,因为此过程会消耗额外的能量。
这是启动序列的一些日志,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 毫秒。如果设备是平放的,那么第一个回调是不正确的——正确的回调发生在大约 20 毫秒后。这些第一个 deviceOrientation 通知往往发生在第一个 viewController 的 viewWillAppear
和 viewDidAppear
之间(但这些事件没有关联)。
为了进行比较,这里是 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
查找
如何在应用程序启动时获取当前设备界面方向,即包含应用程序图标的主屏幕方向?
例如,iPad 正在以横向界面方向 (UIInterfaceOrientationLandscapeLeft
) 放置屏幕 (UIDeviceOrientationFaceUp
),这是我想要得到的。在应用程序启动时,所有界面功能如
viewController.interfaceOrientation
[[uiApplication sharedApplication] statusBarOrientation]
给出错误的默认值 UIInterfaceOrientationPortrait
。有哪些可能的方式?
界面方向
在 didFinishLaunchingWithOptions
被称为...
- (BOOL)application:(UIApplication *)application
willFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
这里可以查询UIScreen和UIApplication:
[UIScreen mainScreen].bounds
[UIApplication sharedApplication].statusBarOrientation
这些将根据应用程序启动时的 OS 状态为您提供正确的宽度、高度和界面方向。 (在任何情况下最好避免使用 viewController.interfaceOrientation
,因为它在 iOS8 中已弃用。)
在你的问题中,你认为 statusBarOrientation 不正确,但它在 iPad mini / 8.3 上对我来说工作正常。
设备方向
如果您对设备方向感兴趣,则需要开始侦听设备方向通知。您可以在视图控制器中的应用程序委托中执行此操作 - 无论哪种方式都不会影响您获取信息的时间,因为设备方向轮询需要时间来启动。此外,如果您面朝上/面朝下,您获得的 first 设备方向回调可能是错误的:我认为它只是从界面方向中获取提示。
这就是您开始聆听的方式:
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(deviceOrientationDidChange:)
name: UIDeviceOrientationDidChangeNotification
object: nil];
如果您在第一次回调之前检查设备方向,它将未初始化,因此对您没有多大用处。完成后您应该停止收听,因为此过程会消耗额外的能量。
这是启动序列的一些日志,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 毫秒。如果设备是平放的,那么第一个回调是不正确的——正确的回调发生在大约 20 毫秒后。这些第一个 deviceOrientation 通知往往发生在第一个 viewController 的 viewWillAppear
和 viewDidAppear
之间(但这些事件没有关联)。
为了进行比较,这里是 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
查找