在iOS8 +中,UIScreen上的-nativeScale和-scale有什么区别?

在此问题中发布的示例日志中,结果完全相同。 有谁知道这两者之间是否存在逻辑差异?

即使是Apple的描述也令人困惑。 以下是scale说明:

与屏幕关联的自然比例因子…此值反映了从默认逻辑坐标空间转换为此屏幕的设备坐标空间所需的比例因子…

以下是他们对nativeScale的描述 :

物理屏幕的原生比例因子

自然本土有什么区别?

nativeBoundsnativeScale属性主要用于OpenGL,表示实际的像素大小和用于精确绘制屏幕分辨率的点到像素比例因子,可以避免额外的绘制渲染成本在虚拟1242×2208大小。 例如,使用CAEAGLLayer,您可以这样做:

 theGLLayer.contentsScale = [UIScreen mainScreen].nativeScale; 

…然后只需要以nativeBounds的大小呈现其内容,即1080×1920。

该问题中的样本日志来自模拟器,模拟器始终不能保证与实际设备的行为相同。

scale和nativeScale都会告诉您一个点对应的像素数。 但请记住,点会被渲染到像素的中间缓冲区,然后resize以匹配屏幕分辨率。 那么,当我们问,“1 pt对应于多少像素?” 它可能意味着中间像素(比例)或最终像素(nativeScale)。

在iPhone Plus上,比例为3,但nativeScale为2.6。 这是因为内容以3x(1点= 3像素)渲染,但随后缩小得到的位图,导致1点= 2.6像素。

因此,scale处理中间位图,nativeScale处理最终位图。


这是没有显示缩放。 如果启用显示缩放,则缩放保持不变,为3,因为中间缓冲区仍然以1点= 3像素渲染。 但原生规模变为2.8。

因此,如果要检查物理屏幕,请使用比例。 例如,如果您的应用程序仅在iPhone Plus上运行,则可以执行以下操作:

 if scale != 3 { print("Not supported") } 

不:

 if nativeScale != 2.6 { print("Not supported") } 

当用户启用显示缩放时,第二个代码片段无法执行预期的操作。

Interesting Posts