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

时间:2010-10-05 01:31:35

标签: iphone objective-c

任何人都知道是否有办法在运行时获得设备的屏幕密度(ppi)?如果苹果将来切换它,不必硬编码不同的密度是很好的...

2 个答案:

答案 0 :(得分:23)

我一直在寻找这个问题太久了,似乎没有一个简单的方法来获得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是163 dpi,带有视网膜显示屏的iPhone是326,iPad是132.所以iPad的dpi使用这个公式并不是特别准确,尽管iPhone很不错。如果您希望已知设备具有更高的准确度,则可以对已知设备的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 :(得分:4)

尝试https://github.com/lmirosevic/GBDeviceInfo

int ppi = [GBDeviceInfo deviceInfo].displayInfo.pixelsPerInch;                // #> 326]

适用于iOS和OSX