iOS横屏左 vs 右 vs 错误

9
TL;DR: iOS文档与Info.plist在哪个方向上(横屏左侧还是右侧)的主页按钮存在分歧。我错过了什么吗?(例如,代码认为自己处于哪个方向和设备实际所处的方向有区别。请参见下面标记为❓的倒数第二个项目。) UIDeviceOrientation的文档如下:

screenshot from docs

然而,当我在Xcode中使用“通用”复选框时,Info.plist文件显示相反的结果:

screenshots from Xcode

上述信息清晰地呈现了矛盾之处。我的问题是:我是否遗漏了一些东西,或者应该将其视为工具链/文档/API中长期存在的垃圾?
当应用在模拟器或设备上运行时,究竟会发生什么呢?以下是我收集到的数据子集。为了方便阅读,我强调了LEFT和RIGHT这些术语。你的大脑可能仍然会爆炸。
需要跟踪三个量:
1. Xcode/plist中说的内容 2. 模拟器菜单项所说的内容[或设备方向] 3. API调用UIDevice.current.orientation所说的内容。
当“General”复选框仅设置为“Landscape LEFT”时:
  • Info.plist文件中写着“横屏(左 home 按钮)” [与文档不一致]
  • 模拟器启动
    • 屏幕图像正确显示 [即正确的方向]
    • Hardware > Orientation 菜单项选中“横屏右侧” [与 Xcode/plist 不一致]
    • home 按钮在左侧 [即菜单项和 home 按钮位置的关系符合文档]
  • UIDevice.current.orientation == .landscapeRIGHT [与 Xcode 不一致,但与 Simulator 菜单一致]
  • 选择菜单项 Hardware > Orientation > Landscape LEFT
    • 翻转屏幕图像并倒置 [正确行为:不自动旋转图像]
    • home 按钮在右侧 [当然]
    • UIDevice.current.orientation == .landscapeLEFT [与文档一致/与 Xcode/plist 相反]
  • 以 home 按钮在左侧的方式启动 iPhone:
    • 正确显示屏幕图像
    • UIDevice.current.orientation == .landscapeRIGHT [与文档一致/与 Xcode/plist 相反]
  • 将手机旋转 180°
    • home 按钮在右侧 [当然]
    • UIDevice.current.orientation == .landscapeRIGHT [即与应用程序认为正在发生的情况一致,而不是与设备的物理方向一致]
  • iPad 的行为与 iPhone 相同

你能检查一下你的 info.plist源码吗?当我尝试在新项目中复制这个时,它创建了一个只支持一种方向的新数组。但是另一个包含所有方向支持的数组也在那里?正在研究可能出现的问题,但仍在尝试复制这个,这很有趣。这就可以解释为什么。这是我的 plist 源代码勾选框显示的内容。https://imgur.com/a/MvswGVk - NSGangster
但是除了 plist 之外,其他都匹配。 - NSGangster
然而,查看plist XML源是我没有考虑到的事情。当配置如上面的屏幕截图时,UISupportedInterfaceOrientations数组有一个值UIInterfaceOrientationLandscapeLeft。 Xcode和API之间的矛盾仍然存在。 - Andrew Duncan
我也遇到过同样的问题,这会导致开发人员在模拟器中测试固定方向的应用程序时感到相当困惑。 - Scott D
我忘记做的事情是:调用 UIDevice.current.beginGeneratingDeviceOrientationNotifications() - Andrew Duncan
显示剩余4条评论
1个回答

7
我认为主要是Xcode UI和info.plist之间存在矛盾。Xcode UI显示“设备方向”,而info.plist则涉及“支持的界面方向”。但我们知道这两个东西是不同的,所以肯定有些问题。
假设在这两者之间,info.plist 获胜,那么这些字段(针对iPhone和iPad)就用于指定支持的界面方向。也就是说,你还可以通过supportedInterfaceOrientations在特定的视图控制器中覆盖相同的选项。
而引用的文档页面则涉及设备方向,其对“landscapeLeft”有自己的定义:Home键在右边。
现在,看一下界面方向掩码文档,上面没有详细说明什么是landscapeLeft,但旧版的Xcode UI截图显示主页按钮在左侧。例如,请参见此SO线程

enter image description here

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

结论

总的来说,我觉得:

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

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


您描述了一个精神分裂的情况...但我认为您是正确的。一开始(第二次,第三次)看起来很令人困惑,难怪如此。 - Andrew Duncan
我同意,但这是我目前所能看到的。官方文档中的设备和接口定义明显相反。这是一个事实,截至今天。然后,从之前的UI截图来看,Xcode UI和info.plist也不同,但正确的似乎是plist定义。 - superjos
2
我刚在 UIApplication.h 中看到了这条评论,它可能会让人有所启发。我逐渐意识到设备方向和内容方向是两个不同的概念。"请注意,UIInterfaceOrientationLandscapeLeft 等于 UIDeviceOrientationLandscapeRight(反之亦然)。这是因为将设备向左旋转需要将内容向右旋转。" - Andrew Duncan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接