'显示缩放' iPhone 6 / 6s设置模糊图形

时间:2016-03-05 17:20:05

标签: ios xcode swift optimization uibezierpath

我在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()图形如何保持像素完美精确度?

2 个答案:

答案 0 :(得分:6)

你无能为力。选择缩放模式的用户故意丢弃像素精度。图中的点不再与屏幕上的像素一一对应(或一对二或一对三或任何整数比)。因此,这个选择模糊了用户所做的所有的屏幕,而不仅仅是你的应用程序。

您也无法检测到正在发生的事情,因为实际上缩放的iPhone 6会以iPhone 5的形式呈现给您的应用程序(并且缩放的6 Plus会以6的形式呈现给您的应用程序。)

答案 1 :(得分:4)

作为@matt says,对于正常的UIKit内容,您无法做到这一点

但是,对于Open GL ES或Metal内容, 能够opt-out of the sampling that the device does,并直接渲染到设备的物理坐标中 - 允许像素完美绘制。< / p>

  

在使用Metal或OpenGL ES的图形应用程序中,内容可以在显示器的精确尺寸上轻松呈现,而无需额外的采样阶段。这对于为每个渲染像素执行许多计算的高性能3D应用程序至关重要。相反,创建要渲染的缓冲区就是显示的精确分辨率。

Open GL ES

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