8

我知道这个主题在 SO 受到了很多关注,但是没有一个“解决方案”对我有用。情况如下:

  1. iPad 平放在我的桌子上(设备正面朝上),主屏幕清晰易读,但主页按钮在顶部。所以这有效地显示了“Portrait Up Side Down”界面方向。

  2. 我启动我的应用程序

  3. 该应用程序调用beginGeneratingDeviceOrientationNotifications以确保加速度计正常工作,并且方向通知进入。

  4. 在启动时,我的应用程序同时查询“界面方向”和“设备方向”。结果是:

     STARTUP ORIENTATION:
         INTERFACE ORIENTATION: UIInterfaceOrientationPortrait
         DEVICE ORIENTATION: UIDeviceOrientationFaceUp
    

    Apple 文档说每个应用程序(界面?)都以纵向方向开始,所以这可能是有道理的。设备方向也是正确的,因为这确实是正面朝上的。

  5. 启动后,第一个方向通知即将到来:

    NOTIFICATION 1: 
        INTERFACE: UIInterfaceOrientationPortrait   
        DEVICE: UIDeviceOrientationPortrait
    

    同样,界面的纵向,(这与我的预期相反,主屏幕显示为上下方向),据说设备也是纵向的(不是这样,但这显然是当设备正面朝上或朝下时如何确定应用内容的方向的巧妙方案)。

  6. 正如许多人提到的,另一个(只有一个,不是两个)方向通知如下:

    NOTIFICATION 2: 
        INTERFACE: UIInterfaceOrientationPortrait   
        DEVICE: UIDeviceOrientationFaceUp
    

    界面仍然是纵向的(而不是倒置),而设备则是背朝的(这是正确的)。

我的应用程序可以正确调整自身,并且显示为上下颠倒,这是完全错误的。

我该怎么做才能知道最后已知的方向,即主屏幕和 iPad 上其他 UI 中显示的方向?

这是一个只有一个窗口和一个视图的 OpenGL 应用程序。我已经在组合中添加了一个 UIViewController 以查看这是否提供了更准确的信息,但它是一样的,而且是错误的。我知道我不是唯一一个为此苦苦挣扎的开发人员,因为我在 iPad 上的许多应用程序也做错了,你必须倾斜设备以使它们正确定位。但有些应用程序似乎做对了,秘诀是什么

4

1 回答 1

4

好吧,我不高兴不得不承认我确实忽略了迷宫中的一个重要部分,即 iOS 设备/界面方向:UISupportedInterfaceOrientations应用程序 Info.plist 文件中的属性。

我阅读了它并(错误地)假设通过指定支持的方向,行为不会改变。但事实证明,它不仅仅是方向通知的过滤器(它不是,您仍然会收到不受支持的方向的通知),但通知的类型/顺序因设备的方向而异。

就我而言,我对“面朝上”和“面朝下”方向不感兴趣,所以我忽略了它们。这不是一个好主意。如果您明确指定支持的方向:

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationPortraitUpsideDown</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>

...那么您仍然会看到我在上面的评论中描述的行为:

“从本质上讲,该设备正在假装用户真的很快将其摇回直立位置,然后又回落。”

...但第一个通过的方向并不总是纵向,而是正确的方向。

因此,在我在问题中描述的场景中,设备方向如下:

AT STARTUP: UIDeviceOrientationFaceUp
NOTIFICATION 1: UIDeviceOrientationPortraitUpsideDown <-- CORRECT!
NOTIFICATION 2: UIDeviceOrientationFaceUp <-- CORRECT, BUT IGNORE

我不想走得太远,称这是苹果的一个错误,但我不清楚为什么当你不指定时传入的方向NOTIFICATION 1总是纵向UISupportedInterfaceOrientations的。

请注意,这仅适用于 iPad。iPod Touch 和 iPhone 上的主屏幕 UI 始终是纵向的,因此在启动时更容易知道该方向是什么(您猜对了:纵向)...

于 2011-06-10T14:59:07.053 回答