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

MZa*_*kow 20 iphone objective-c

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

max*_*max 23

我一直在寻找它太长时间了,似乎没有一个简单的方法来获得dpi.但是,UIScreen的文档说,未缩放的点大约相当于1/160英寸.

所以,基本上如果你想要dpi,你可以将比例乘以160.

  float scale = 1;
  if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    scale = [[UIScreen mainScreen] scale];
  }
  float dpi = 160 * scale;
Run Code Online (Sandbox Code Playgroud)

(带有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;
  }
Run Code Online (Sandbox Code Playgroud)

这不是很理想,我不介意自己找到更好的解决方案,但这是我能找到的最好的解决方案.