iOS 横向左 vs 右 vs 错误

And*_*can 6 landscape screen-orientation ios

TL;DR:iOS 文档不同意Info.plist哪个方向(横向左与右)在哪一侧有主页按钮。我错过了什么吗?(例如,代码认为它所处的方向与设备知道它所处的方向之间存在区别。请参阅下面标记为 ? 的倒数第二个要点。)

的文档UIDeviceOrientation

来自文档的屏幕截图

但是,当我在 Xcode 中使用 General 复选框时,Info.plist文件显示相反

来自 Xcode 的屏幕截图

上述信息足以清楚地说明矛盾。我的问题是:我是否遗漏了某些东西,或者我应该将其视为工具链/文档/API 中的长期残留物?


您会问,当应用程序在模拟器或设备上运行时,实际会发生什么?以下是我收集的数据的一个子集。为了您的阅读方便,我强调了LEFT 和RIGHT 这两个术语。你的大脑可能仍然会爆炸。

需要跟踪三个数量:

  • 什么 Xcode/plist 说
  • 模拟器菜单项说什么[或设备方向什么]
  • API 调用UIDevice.current.orientation说明了什么。

当 General 复选框单独设置为 "Landscape LEFT" 时

  • Info.plist文件说“横向(左主页按钮)”[即不同意文档]
  • 模拟器启动
    • 屏幕图像颠倒 [即正确]
    • 选中“硬件”>“方向”菜单项“Landscape RIGHT”[即不同意 Xcode/plist]
    • 主页按钮在左侧 [即菜单项和主页按钮位置之间的关系与文档一致]
  • UIDevice.current.orientation == .landscapeRIGHT [即不同意Xcode,但同意模拟器菜单]
  • 选择菜单项 Hardware > Orientation > Landscape LEFT
    • 将屏幕图像翻转过来 [正确行为:没有图像自动旋转]
    • 将主页按钮放在右侧 [当然]
    • UIDevice.current.orientation == .landscapeLEFT [与文档一致/与Xcode/plist相反]
  • 使用左侧的主页按钮启动 iPhone:
    • 正确显示屏幕图像
    • UIDevice.current.orientation == .landscapeRIGHT [与文档一致/与Xcode/plist相反]
  • 将手机旋转 180°
    • 将主页按钮放在右侧 [当然]
    • ? UIDevice.current.orientation == .landscapeRIGHT[即它与应用程序认为正在发生的事情一致,而不是与设备的物理方向一致]
  • iPad 的行为与 iPhone 相同

sup*_*jos 7

我认为主要是Xcode UI和info.plist之间的矛盾问题。Xcode UI 显示“设备方向”,而 info.plist 谈论“支持的界面方向”。但正如我们所知,这两者是不同的东西,所以肯定有问题。

假设在两者之间,info.plist获胜,那么这些字段(适用于 iPhone 和 iPad)用于指定支持的界面方向。即您也可以通过在特定视图控制器中覆盖相同的选项supportedInterfaceOrientations

相反,引用的文档页面是关于设备方向的,它有自己的landscapeLeft定义:右侧的主页按钮。

现在,查看Interface Orientation Mask文档,没有关于什么是LandscapeLeft的真正细节,但旧的 Xcode UI 屏幕截图显示主页按钮位于左侧。例如,参见此 SO 线程

在此输入图像描述

编辑:界面方向文档页面详细介绍了什么是landscapeLeft:左侧的主页按钮,如旧屏幕截图所示。

结论

所以,总而言之,在我看来:

  1. Xcode UI/info.plist 是关于支持的界面方向,它有自己的横向左/右定义

  2. 设备方向具有与横向左/右相反的定义

  • 我刚刚在“UIApplication.h”中看到了这条评论,它要么揭示了一些线索。我逐渐意识到*设备*和*内容*方向是两个不同的东西。“请注意,‘UIInterfaceOrientationLandscapeLeft’等于‘UIDeviceOrientationLandscapeRight’(反之亦然)。这是因为向左旋转设备需要向右旋转内容。” (2认同)