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

时间:2014-09-16 14:46:38

标签: ios ios8 uiscreen

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

即使Apple's description令人困惑。以下是scale

的说明
  

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

这是他们的description of nativeScale

  

物理屏幕的原生比例因子

自然原生有什么区别?

2 个答案:

答案 0 :(得分:22)

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

theGLLayer.contentsScale = [UIScreen mainScreen].nativeScale;

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

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

答案 1 :(得分:20)

scale和nativeScale都会告诉您一个点对应的像素数。但请记住,点会呈现为intermediate buffer of pixels,然后调整大小以匹配屏幕分辨率。所以,当我们问,“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")
}

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