“显示缩放”iPhone 6 / 6s设置模糊graphics
我正在编写Xcode 7 / Swift 2中的一个项目,它针对iPhone 6 / 6s进行了优化(例如,该项目有一个启动屏幕文件和用于iPhone 6 / 6s的启动屏幕图像)。
幸运的是,不幸的是,iPhone 6用户可以打开设备上的“显示缩放”设置,从而扩大界面元素。 打开时,此设置有效地放大标准的iPhone 5屏幕大小,以适应iPhone 6的屏幕空间,升频到x1.171875。 此上采样会导致基于栅格的元素(如包含UIBezierPath()
graphics的图像,图标或视图UIBezierPath()
显示模糊(轻微但显着)。
几个问题:
感谢有关这个难题的任何有经验的回应。 谢谢。
1 – 如何在代码中指示故事板上的元素(例如UIView),以便在用户打开时忽略显示缩放设置?
2 – 显示缩放function打开时,有哪些技术可以确保像素的完美精度? (例如,是否有可能使用OpenGL渲染渲染graphics,如果是这样,如何?)
3 – 是否可以使用x4图像replacex2图像以减less显示缩放时的任何模糊? (例如,iOS会在iPhone 6上将x4图像缩小为x2图像?)
4 – 显示缩放时, UIBezierPath()
绘图如何保持像素的完美精度?
没有什么可以做的。 select放大模式的用户故意丢弃像素精度。 graphics中的点不再与屏幕上的像素一一对应(或一对二或一对三或任何整数比例)。 因此,这种select模糊了用户所做的一切屏幕,而不仅仅是您的应用程序。
你也不能检测到发生了什么事情,因为实际上,缩放的iPhone 6以iPhone 5的forms呈现给你的应用程序(而缩放的6 Plus则以6的forms呈现给你的应用程序)。
正如@matt所说 ,对于正常的UIKit内容,你无能为力
但是,对于Open GL ES或Metal内容,您可以select不使用该设备的采样 ,并直接渲染设备的物理坐标 – 从而实现像素完美的绘制。
在使用Metal或OpenGL ES的graphics应用程序中, 内容可以在显示器的精确尺寸下轻松呈现,而无需额外的采样阶段 。 这对高性能3D应用程序非常重要,可以为每个渲染像素执行许多计算。 相反,创build缓冲区来渲染到显示器的确切分辨率。
打开GL ES
将CAEAGLayer
的contentsScale
设置为[UIScreen mainScreen].bounds.nativeScale
,或者使用GLKView
自动完成。
然后,您将需要创build与设备的物理坐标大小的帧缓冲区。
金属
将CAMetalLayer
的contentsScale
设置为[UIScreen mainScreen].bounds.nativeScale
,或者使用一个MTKView
,它将自动执行此操作。
您还将需要调整可绘制大小来解释缩放比例(从文档中解除):
CGSize drawableSize = self.bounds.size; drawableSize.width *= self.contentScaleFactor; drawableSize.height *= self.contentScaleFactor; metalLayer.drawableSize = drawableSize;
另请参阅这篇有趣的博客文章,介绍iPhone 6 Plus如何渲染内容,以及关于显示缩放的后续文章 。