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

Dev*_*hen 32 ios uiscreen ios8

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

即使是Apple的描述也令人困惑.以下是对的描述scale:

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

以下是他们的描述nativeScale:

物理屏幕的本比例因子

自然本土有什么区别?

Noa*_*oon 22

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

theGLLayer.contentsScale = [UIScreen mainScreen].nativeScale;
Run Code Online (Sandbox Code Playgroud)

...然后只需要以nativeBounds1080×1920 的大小呈现其内容.

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

  • 别担心.从模拟器看起来,scale/nativeScale似乎用于指示应用程序是以6-Plus分辨率原生渲染还是从2x放大.例如,如果我不包含2208x1242启动图像,那么该应用程序将作为2x应用程序启动,扩展到3倍.在这种情况下,"nativeScale"报告为3x,而"scale"报告为2x. (5认同)
  • 请参阅barfoon对此答案的评论 - http://stackoverflow.com/a/25964199/303179.这证实了NativeScale在iPhone 6 Plus上的预期价值.现在回顾我对"9月16日17:57"的评论,剩下要确认的最后一件事是DEVICE上的nativeScale(3x或2.61x)的值,当应用程序不包含2208x1242启动图像时(当它表现时)作为一个2x应用程序,缩放到3倍).@Noah Witherspoon,请你检查一下(在可预见的将来我不会有6-Plus设备).PS:对延迟表示歉意,我已经连续几周没有上网了. (2认同)

Vad*_*ick 20

scale和nativeScale都会告诉您一个点对应的像素数.但请记住,点会被渲染到像素中间缓冲区,然后调整大小以匹配屏幕分辨率.所以,当我们问,"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")
}
Run Code Online (Sandbox Code Playgroud)

不:

if nativeScale != 2.6 {
  print("Not supported")
}
Run Code Online (Sandbox Code Playgroud)

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

  • Apple文档上有一个很好的表格:https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/Displays/Displays.html#//apple_ref/doc/uid/TP40013599-CH108 -SW2 (2认同)
  • 注意:在模拟器上,这些值相等 (2认同)