46

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

甚至苹果的描述也令人困惑。以下是 的描述scale

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

这是他们的描述nativeScale

物理屏幕的原生比例因子

naturalnative和有什么不一样?

4

2 回答 2

36

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

在 iPhone 6 Plus(或同等尺寸的设备)上,scale 为 3,但 nativeScale 为 2.6。这是因为内容以 3 倍(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")
}

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

于 2017-01-15T13:11:15.167 回答
30

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

theGLLayer.contentsScale = [UIScreen mainScreen].nativeScale;

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

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

于 2014-09-16T15:29:59.897 回答