iOS8+ UIScreen 上的 -nativeScale 和 -scale 有啥区别?

Posted

技术标签:

【中文标题】iOS8+ UIScreen 上的 -nativeScale 和 -scale 有啥区别?【英文标题】:What is the difference between -nativeScale and -scale on UIScreen in iOS8+?iOS8+ UIScreen 上的 -nativeScale 和 -scale 有什么区别? 【发布时间】:2014-11-10 09:14:44 【问题描述】:

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

即使Apple's description 也令人困惑。这里是scale的描述:

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

这是他们的description of nativeScale

物理屏幕的原生比例因子

naturalnative有什么区别?

【问题讨论】:

不多,我会说。这令人困惑。 还有这两者和UIViewcontentScaleFactor有什么区别? 【参考方案1】:

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

theGLLayer.contentsScale = [UIScreen mainScreen].nativeScale;

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

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

【讨论】:

这是有道理的。你有一个方便的日志来确认吗?如果没有,我可以稍后再处理。 目前还不能分享,抱歉:) 不用担心。从模拟器看来,scale/nativeScale 似乎用于指示应用程序是以 6-Plus 分辨率原生渲染还是从 2x 放大。因此,例如,如果我不包含 2208x1242 的启动图像,则应用程序将作为 2x 应用程序启动,放大到 3x。在这种情况下,“nativeScale”报告为 3x,而“scale”报告为 2x。 代码:NSLog(@"\n原生比例:%1.2f\n比例:%1.2f", [[UIScreen mainScreen] nativeScale], [[UIScreen mainScreen] scale]);结果,@"Native scale: 3.00 \nScale: 2.00" 用于 2x 应用程序缩放到 3x(无启动图像),@"Native scale: 3.00 \nScale: 3.00" 用于本机 3x 应用程序(具有 6-Plus 启动图像)。 查看 barfoon 对此答案的评论 - ***.com/a/25964199/303179。这证实了 iPhone 6 Plus 上 nativeScale 的预期值。现在回顾一下我对“9 月 16 日 17:57”的评论,最后要确认的是设备上的 nativeScale(3x 或 2.61x)的值,当应用程序不包含 2208x1242 启动图像时(当它的行为作为 2x 应用程序,缩放到 3x)。 @Noah Witherspoon,请您检查一下(在可预见的将来我不会有 6-Plus 设备)。 P.S:抱歉耽搁了,我已经有几个星期没有上网了。【参考方案2】:

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

当用户启用显示缩放时,第二个代码片段未能达到预期效果。

【讨论】:

Apple 文档中有一张很好的表格:developer.apple.com/library/content/documentation/…

以上是关于iOS8+ UIScreen 上的 -nativeScale 和 -scale 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

iOS8.0(和 8.1)上第二个 UIScreen 的自动旋转问题

[UIScreen mainScreen].bounds.size 在 iOS8 中是不是变得依赖于方向?

iOS - iPad 的 viewWillTransition 中的 UIScreen 边界错误

UIScreen 亮度上的 Swift 选择器在调用时返回 UIDevice

将 iOS 设备上的触摸发送到另一个 UIScreen(外部显示器)

设置 UIScreen 值后保持 UIWindow 大小