我知道这个主题在SO上得到了很多关注,但没有一个“解决方案”对我有用。情况如下:
iPad在桌面上是平的(面朝上设备方向),主屏幕完全可读,但主页按钮位于顶部。因此,这有效地显示了“纵向向下”界面方向。
我启动了我的应用
应用程序调用{{1}}以确保加速度计正常工作,并且会出现方向通知。
启动时,我的应用会查询“界面方向”和“设备方向”。结果是:
beginGeneratingDeviceOrientationNotifications
Apple文档说每个应用程序(界面?)都是纵向开始的,所以这很有意义。设备方向也是正确的,因为这确实是正面的。
启动后,第一个方向通知即将进入:
STARTUP ORIENTATION:
INTERFACE ORIENTATION: UIInterfaceOrientationPortrait
DEVICE ORIENTATION: UIDeviceOrientationFaceUp
再次,界面的肖像,(与我期望的相反,主屏幕向上朝下显示),该设备据说也是纵向(不是这样,但是这显然是一个聪明的方案,可以解决当设备面朝上或朝下时如何确定应用程序内容的方向。
正如很多人提到的那样,另一个(只有一个,而不是两个)方向通知如下:
NOTIFICATION 1:
INTERFACE: UIInterfaceOrientationPortrait
DEVICE: UIDeviceOrientationPortrait
接口仍然纵向(而不是上下颠倒),然后返回设备的面朝上(这是正确的)。
我的应用程序正确调整,并且显示在一边,这是完全错误的。
我该怎么做才能知道上次已知的方向,主屏幕和iPad上的其他用户界面显示的方向?
这是一个只有窗口和视图的OpenGL应用程序。我已经在混合中添加了一个UIViewController来查看它是否提供了更准确的信息,但它只是相同而且错误。我知道我并不是唯一一个在这方面苦苦挣扎的开发者,因为我在iPad上的许多应用程序也做错了,你必须倾斜设备才能使它们正确定位。但有些应用做似乎做对了,秘诀是什么?
答案 0 :(得分:4)
好的,我很高兴不得不承认我 忽略了迷宫中的一个重要部分,即iOS设备/界面方向:应用程序信息中的UISupportedInterfaceOrientations
属性.plist文件。
我读到了它并且(错误地)假设通过指定支持的方向,行为不会改变。但事实证明,它不仅仅是方向通知的过滤器(它不是,你仍然会收到不支持的 orienations的通知),但通知的类型/顺序会有所不同,具体取决于设备是面向的。
在我的情况下,我对“面朝上”和“面朝下”的方向不感兴趣,所以我只是忽略了它们。这不是一个好主意。如果明确指定支持的方向:
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
...然后你仍会看到我在上面评论中描述的行为:
“从本质上讲,设备假装用户真的很快将其摇回到直立位置,然后退回。”
...但是第一个传递的方向并不总是 portrait ,而是正确的方向。
因此,在我在我的问题中描述的场景中,设备方向如下:
AT STARTUP: UIDeviceOrientationFaceUp
NOTIFICATION 1: UIDeviceOrientationPortraitUpsideDown <-- CORRECT!
NOTIFICATION 2: UIDeviceOrientationFaceUp <-- CORRECT, BUT IGNORE
我不想走得那么远,并称这是苹果公司的一个错误,但我不清楚为什么NOTIFICATION 1
中的传递方向总是肖像 t指定UISupportedInterfaceOrientations
。
请注意,这仅适用于iPad。 iPod Touch和iPhone上的主屏幕UI始终处于纵向状态,因此更容易了解启动时的方向(您猜对了: portrait )...