我维护了一个自 2010 年以来一直在 iOS 上运行的 OpenGL 应用程序。它使用全屏并隐藏状态栏。它在没有任何 .nib 文件的情况下启动,并创建一个 OpenGL 视图和控制器,进而显示所有应用程序内容。
我需要进行哪些更改才能使应用程序在 iPhone X 上使用新的“安全区域”布局设计?大概唯一真正的变化是创建我的“EAGL”表面/视图,其尺寸和位置与安全区域而不是整个屏幕相同?
您如何尊重“全屏”应用程序(如大多数 GL、Metal 等游戏)中的安全区域实际上是两个问题:一个是设计,一个是实现。(但是以相反的顺序处理它们更容易,所以这里......)
如果您有一个全屏视图(例如窗口的根视图控制器)并且您只是将其设置layerClass
为CAEAGLLayer
(与大多数 OpenGL ES 工作中的课程相同),您将获得一个覆盖 iPhone X 整个 1125 x 2436 矩形的视图屏幕。(一定要设置比例,这样你才能真正得到所有这些像素...... 375 x 812 @ 1x 比例在那个屏幕上可能看起来很可怕。)
这可能是您希望为您的应用程序/游戏提供的用户体验(这是Apple 鼓励的)......您的 3D 内容一直延伸到屏幕边缘,围绕底部和顶部的曲线。这比在所有内容周围留下黑色边框要好得多。
另一方面,现有的 OpenGL内容外观设计可能与 iPhone X 形状奇特的屏幕非常匹配,也可能不合适。如果您在顶部有任何希望用户看到的东西,它就会被遮挡在相机/传感器/扬声器切口后面。同样,如果底部有任何重要的东西,它的边缘将在弯角后面被切断。
在这种情况下,您需要将全屏内容的不重要部分(如游戏中的 3D 游戏世界视图)保留为全屏,但插入任何重要的内容,如 UI 覆盖或交互式 3D 元素。至于如何做到这一点,有几种可行的方法,需要权衡:
硬编码 iPhone X 障碍物尺寸,检测您何时在 iPhone X 上运行,并相应地修复您的布局。这很简单,但并不可靠。如果 Apple 决定改变屏幕边缘周围的软件 UI 元素(如滑动到主页指示器)的工作方式,或者明年让 iPhone XI(或 X2?或 XX?)形状略有不同,你需要再次更新以适应。
即使您不使用 UIKit 或自动布局来绘制/定位屏幕内容,也可以使用安全区域指南。询问视图safeAreaLayoutGuide
并将该指南的边界转换为用于定位使用 OpenGL 绘制的内容的任何坐标系。这需要做更多的工作,但它可以确保您的应用程序已准备好应对 Apple 未来抛出的任何曲线球。
它使用全屏并隐藏状态栏。
在为 iPhone X 设计时,值得重新考虑“全屏”应用是否应该隐藏状态栏。在其他 iOS 设备上,显示状态栏意味着从您的应用内容中占用有用的空间。但是在 iPhone X 上,大多数应用程序无论如何都没有任何有用的东西可以用那些“恶魔之角”的角落做 - 你的用户可能会喜欢仍然能够看到时钟、电池等。