平板时iPad设备的方向总是错误的

zmi*_*pie 8 launch ipad device-orientation

我知道这个主题在SO上引起了很多关注,但没有一个"解决方案"对我有用.情况如下:

  1. iPad在我的桌面上是平的(面朝上的设备方向),主屏幕是完全可读的,但主页按钮在顶部.所以这有效地显示了"Portrait Up Side Down" 界面方向.

  2. 我开始我的应用程序

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

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

     STARTUP ORIENTATION:
         INTERFACE ORIENTATION: UIInterfaceOrientationPortrait
         DEVICE ORIENTATION: UIDeviceOrientationFaceUp
    
    Run Code Online (Sandbox Code Playgroud)

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

  5. 发布后,第一个方向通知即将进入:

    NOTIFICATION 1: 
        INTERFACE: UIInterfaceOrientationPortrait   
        DEVICE: UIDeviceOrientationPortrait
    
    Run Code Online (Sandbox Code Playgroud)

    再一次,界面的肖像(这与我期望的相反,主屏幕显示自己向上朝下的方向),该设备也被称为纵向(不是这样,但这是显而易见的一个聪明的方案,以解决当设备面朝上或朝下时如何定位应用程序的内容).

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

    NOTIFICATION 2: 
        INTERFACE: UIInterfaceOrientationPortrait   
        DEVICE: UIDeviceOrientationFaceUp
    
    Run Code Online (Sandbox Code Playgroud)

    接口仍然是纵向(而不是正面向下),并且设备面朝上(这是正确的).

我的应用程序正确调整自己,并显示在一边,这是完全错误的.

我该怎么做才能知道上一个已知的方向,主屏幕和iPad上的其他用户界面显示的方向?

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

zmi*_*pie 4

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

我读到它并(错误地)假设通过指定支持的方向,行为不会改变。但事实证明,它不仅仅是方向通知的过滤器(事实并非如此,您仍然会收到不支持方向的通知),而且通知的类型/顺序会根据设备的方向而有所不同。

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

<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationPortraitUpsideDown</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
</array>
Run Code Online (Sandbox Code Playgroud)

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

“本质上,该设备假装用户真的很快地将其摇回到直立位置,然后又放下来。”

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

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

AT STARTUP: UIDeviceOrientationFaceUp
NOTIFICATION 1: UIDeviceOrientationPortraitUpsideDown <-- CORRECT!
NOTIFICATION 2: UIDeviceOrientationFaceUp <-- CORRECT, BUT IGNORE
Run Code Online (Sandbox Code Playgroud)

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

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