【问题标题】:iOS Landscape Left vs Right vs WrongiOS横向左vs右vs错误
【发布时间】: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


【解决方案1】:

我认为这主要是 Xcode UI 和 info.plist 之间的矛盾问题。 Xcode UI 显示“Device Orientation”,而 info.plist 谈到“Supported Interface Orientation”。但是我们知道这两者是不同的东西,所以肯定有问题。

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

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

现在,看看 Interface Orientation Mask docs,没有关于什么是 landscapeLeft 的真正细节,但旧的 Xcode UI 屏幕截图显示主页按钮在左侧.参见例如来自this SO thread

编辑:Interface Orientation doc page 有详细说明landscapeLeft:左侧的主页按钮,如旧屏幕截图所示。

结论

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

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

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

【讨论】:

  • 你描述了一种精神分裂症的情况..但我认为你是对的。难怪乍一看(第二、第三)会令人困惑。
  • 我同意,但这就是我现在所看到的。官方文档中的设备和接口定义肯定是相反的。这是事实,直到今天。那么Xcode UI和info.plist也是不一样的,但是从之前的UI截图来看,正确的似乎是plist的定义。
  • 我刚刚在UIApplication.h 中看到了这条评论,这也说明了一些问题。我开始意识到 devicecontent 方向是两个不同的东西。 “请注意,UIInterfaceOrientationLandscapeLeft 等于 UIDeviceOrientationLandscapeRight(反之亦然)。这是因为向左旋转设备需要向右旋转内容。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
相关资源
最近更新 更多