获取 iPhone / iPad / iPod Touch 在运行时的 PPI

21

有人知道在运行时如何获取设备的屏幕密度(ppi)吗?如果能不硬编码不同密度,以防苹果在未来更改,那就太好了...

2个回答

24
我已经追寻这个问题很久了,似乎没有简单的方法来获取dpi。然而,UIScreen的文档中说,一个未缩放的点大约等于1/160英寸。 所以,如果你想要dpi,你可以将比例乘以160。
  float scale = 1;
  if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    scale = [[UIScreen mainScreen] scale];
  }
  float dpi = 160 * scale;

(使用respondsToSelector的if语句是为了让代码在旧版本的iOS上正常运行,这些版本没有该属性)

根据维基百科,iPhone的dpi为163,具有视网膜显示器的iPhone为326,iPad为132。因此,使用这个公式计算得出的iPad的dpi并不特别准确,尽管iPhone的准确度相对较高。如果您想要更准确地获取已知设备的dpi,可以为已知设备硬编码dpi值,同时将1/160作为未来设备的回退。

  float scale = 1;
  if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    scale = [[UIScreen mainScreen] scale];
  }
  float dpi;
  if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    dpi = 132 * scale;
  } else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    dpi = 163 * scale;
  } else {
    dpi = 160 * scale;
  }

这并不是真正理想的解决方案,我也很愿意看到更好的解决方案,但这是我能找到的最佳方案。


1
这不适用于iPad mini,它的dpi为163,但是它仍然是iPad的一个版本。 - AlexWien
@AlexWien,你解决了这个问题吗? - Mike Weir
@PhoenixX_2 是的,但是目前还没有完美的解决方案适用于所有已知的iPad mini。它通过获取机器ID来工作。在这里搜索“检测iPad mini”。 - AlexWien
1
如果公式正确,那么iPhone 6 Plus的PPI为489,但实际上的PPI为401。这是参考链接:http://www.alphr.com/apple/apple-iphone-6/7076/iphone-6-vs-iphone-6-plus-screen-comparison - Durai Amuthan.H

4

4
这些像素密度的数值也被硬编码到了这个工具包中。如果你查看代码,你会发现 // 6 Plus @[@7, @1]: @[@(GBDeviceModeliPhone6Plus), @"iPhone 6 Plus", @(GBDeviceDisplay5p5Inch), @401] - ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接