【发布时间】:2019-03-13 19:21:23
【问题描述】:
TL;DR:iOS 文档不同意Info.plist 关于哪个方向(横向左侧与右侧)在哪一侧有主页按钮。我错过了什么吗? (例如,代码认为它所处的方向与设备知道它所处的方向之间存在区别。请参阅倒数第二个要点以下标记为❓。)
UIDeviceOrientation 的文档说
但是,当我在 Xcode 中使用 General 复选框时,Info.plist 文件显示相反:
以上信息清楚地表明了矛盾。我的问题是:我是否遗漏了什么,还是应该将其视为工具链/文档/API 中长期存在的问题?
您问,当应用在模拟器或设备上运行时,实际会发生什么?以下是我收集的数据的一个子集。为了您的阅读方便,我强调了术语 LEFT 和 RIGHT。你的大脑可能仍然会爆炸。
要跟踪三个数量:
- Xcode/plist 怎么说
- 模拟器菜单项显示什么 [或设备方向是什么]
- API 调用
UIDevice.current.orientation的内容。
当常规复选框单独设置为“横向左侧”:
-
Info.plist文件显示“横向(左主页按钮)”[即不同意文档] - 模拟器启动
- 屏幕图像朝上 [i.e.正确]
- 使用硬件 > 方向菜单项“横向”已选中 [即不同意 Xcode/plist]
- 左侧带有主页按钮 [i.e.菜单项和主页按钮位置之间的关系与文档一致]
-
UIDevice.current.orientation == .landscapeRIGHT[即不同意 Xcode,但同意 Simulator 菜单] - 选择菜单项硬件 > 方向 > 横向左
- 将屏幕图像上下翻转 [正确行为:没有图像自动旋转]
- 将主页按钮放在右侧 [当然]
-
UIDevice.current.orientation == .landscapeLEFT[与文档一致/与 Xcode/plist 相反]
- 使用左侧的主页按钮启动 iPhone:
- 正确显示屏幕图像
-
UIDevice.current.orientation == .landscapeRIGHT[与文档一致/与 Xcode/plist 相反]
- 将手机旋转 180°
- 将主页按钮放在右侧 [当然]
- ❓
UIDevice.current.orientation == .landscapeRIGHT[即它与应用程序认为 正在发生的事情一致,而不是与设备的物理方向一致]
- iPad 的行为与 iPhone 相同
【问题讨论】:
-
你能检查你的 info.plist 源吗?对我来说,当我在新项目中复制它时,它创建了一个新数组,只支持一个方向。但是另一个阵列是否支持所有方向?研究这可能导致什么问题,但仍在尝试复制这一点,这很有趣。这可以解释原因。这是我的 plist 源在选中该框的情况下显示的内容。 imgur.com/a/MvswGVk
-
现在我的 gui plist 中出现了两组数组,让我再看看
-
嗯,您从哪里获得编程接口?应用代理?我在 rootViewController 中注册
UIDevice.orientationDidChangeNotification,它被触发了 3 次。启动模拟器时的“右”“左”“左”。会尝试物理设备,看看我是否能重现这个。 -
但看起来除了 plist 之外的所有内容都匹配
-
这个问题实际上只适用于只有一个允许方向的项目。我确实使用
viewWillTransition(to:with:)来查看方向,但没有查看通知。为了以编程方式获取方向,在任何时候(不仅仅是转换)我在屏幕上都有一个按钮,它只将UIDevice.current.orientation打印到控制台。
标签: ios screen-orientation landscape