我在Xcode 7 / Swift 2中编写了一个项目,它针对iPhone 6 / 6s进行了优化(即该项目有一个启动屏幕文件和iPhone 6 / 6s的启动屏幕图像)。
幸运或不幸的是,iPhone 6用户可以在设备上打开“显示缩放”设置,从而放大界面元素。打开时,此设置有效地扩大了标准iPhone 5屏幕尺寸以适应iPhone 6屏幕空间,上采样到x1.171875。此上采样会导致基于栅格的元素(如图像,图标或包含UIBezierPath()
图形的视图显示模糊(温和但明显)。
几个问题:
感谢任何有关这个难题的经验回答。感谢。
1 - 当用户打开它时,如何在代码中指示故事板上的元素(例如UIView)忽略显示缩放设置?
2 - 当显示缩放开启时,有哪些技术可以确保像素完美精确度? (例如,是否可以使用OpenGL渲染渲染图形,如果是这样,如何?)
3 - 当显示缩放开启时,是否可以用x4图像替换x2图像以减少模糊? (即iOS会在iPhone 6上将x4图像下采样到x2图像吗?)
4 - 当显示缩放开启时,UIBezierPath()
图形如何保持像素完美精确度?
答案 0 :(得分:6)
你无能为力。选择缩放模式的用户故意丢弃像素精度。图中的点不再与屏幕上的像素一一对应(或一对二或一对三或任何整数比)。因此,这个选择模糊了用户所做的所有的屏幕,而不仅仅是你的应用程序。
您也无法检测到正在发生的事情,因为实际上缩放的iPhone 6会以iPhone 5的形式呈现给您的应用程序(并且缩放的6 Plus会以6的形式呈现给您的应用程序。)
答案 1 :(得分:4)
但是,对于Open GL ES或Metal内容, 能够opt-out of the sampling that the device does,并直接渲染到设备的物理坐标中 - 允许像素完美绘制。< / p>
在使用Metal或OpenGL ES的图形应用程序中,内容可以在显示器的精确尺寸上轻松呈现,而无需额外的采样阶段。这对于为每个渲染像素执行许多计算的高性能3D应用程序至关重要。相反,创建要渲染的缓冲区就是显示的精确分辨率。
将contentsScale
的{{1}}设置为CAEAGLayer
,或使用[UIScreen mainScreen].bounds.nativeScale
自动执行此操作。
然后,您需要使用设备物理坐标的大小创建帧缓冲区。
将GLKView
的{{1}}设置为contentsScale
,或使用CAMetalLayer
自动执行此操作。
您还需要调整可绘制的尺寸以考虑比例(从the docs解除):
[UIScreen mainScreen].bounds.nativeScale
另请参阅此interesting blog post on how the iPhone 6 Plus renders content,以及the follow-up post specifically about Display Zoom。