如何以编程方式精确查找 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的主要内容,如果未能解决你的问题,请参考以下文章