如何以编程方式精确查找 PPI

Posted

技术标签:

【中文标题】如何以编程方式精确查找 PPI【英文标题】:How to find PPI programmatically with precision 【发布时间】:2016-08-05 18:18:49 【问题描述】:

我正在尝试在 ios 中找出 PPI(每英寸像素数)。

我找不到任何直接的方法来查询这个,就像我们对显示尺寸所做的那样

UIScreen.mainScreen().bounds

有一个way to do it 将比例乘以 iPhone(163) 或 iPad(132) 的标准通用 PPI,但它不准确。

如果公式正确,那么 iPhone 6 plus 的 PPI 是 489 但实际上 PPI 是 401 这是reference

目前看来,硬编码是可行的方法。

但我想使用公式以编程方式进行。

【问题讨论】:

【参考方案1】:

我刚刚将我的一个旧 ObjC 库移植并更新为 Swift。您可以使用它或获取您需要的部分代码。在这里获取:https://github.com/marchv/UIScreenExtension。

该库使用 UIScreen.main.nativeScale 将每英寸像素 (PPI) 转换为每英寸点数。

使用 Cocoapods 安装库,然后导入:

import UIScreenExtension

然后利用它:

if let pointsPerCentimeter = UIScreen.pointsPerCentimeter 
   // code

【讨论】:

值得一提的是,UIScreenExtension 误报了 iPad 2 和 iPad Mini 第 1 代的 PPI。这些应该分别是 132 和 163,因为这两个设备不是 @2x Retina。 @step_jac 我首先误解了你的评论 - 最好在清晨阅读之前先喝杯咖啡:D 好的,我现在可以看到问题 - 会尽快解决 - 感谢您指出 ?【参考方案2】:

我相信没有公共 API 可以获取 PPI 或屏幕的物理尺寸。

唯一的方法是硬编码设备列表及其物理尺寸和/或 PPI(您可以从 UIDevice 类中获取设备类型)。

顺便说一句。这里的问题几乎是问同样的事情(不同的方式): How do ruler apps stay accurate on all devices?

【讨论】:

我想我们可以以点为单位计算屏幕的物理尺寸[UIScreen mainScreen].bounds.size,但是对于除 iPhone 6 plus 之外的所有设备,每点可以找到多少像素,因为它无法像平常一样被发现PPI * 比例,因为 iPhone 6 plus 和 iPhone 6s plus 引入了名为 Retina HD 的新屏幕......所以我认为最好的方法是检查设备是否是 iPhone 6 plus 然后返回 401,其余设备我们可以去提前我猜的公式...... 一种以编程方式检测 iPhone 6 和 iPhone 6s 的方法 (***.com/a/26400686/730807)【参考方案3】:

iPhone Plus 有 scale 3,但 nativeScale 是 2.6。

UIKit 对这些内容进行采样以适应实际的屏幕尺寸。 Metal 或 OpenGL ES 内容应以精确的尺寸呈现。

int screenPPI() 
    return [[UIScreen mainScreen] nativeScale] * ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 132 : 163);

【讨论】:

以上是关于如何以编程方式精确查找 PPI的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式查找 Android 版本名称?

如何使用私有核心图形方法以编程方式缩放屏幕(如何查找函数参数)

如何以编程方式查找设备的公共 IP 地址? [复制]

如何在 C/C++ 中以编程方式查找“保存的游戏”文件夹?

如何以编程方式查找所谓的宏

如何以编程方式查找已加载共享库的版本?