iPhoneのRetina4ディスプレイ判定方法

Retina4か否かを判定する方法をいろいろ調べてみました。
正しいディスプレイのサイズを取得するためには、+[UIScreen mainScreen]メソッドで得られるオブジェクト使うのですが、以下のように3つの値が取得できます。

NSLog(@"mainScreen bounds height %f", [[UIScreen mainScreen] bounds].size.height);
NSLog(@"mainScreen applicationFrame height %f", [[UIScreen mainScreen] applicationFrame].size.height);
NSLog(@"mainScreen currentMode height %f", [[UIScreen mainScreen] currentMode].size.height);

それぞれの結果を見てみると、以下の通りになりました。

  1. mainScreen bounds height 568.000000
    Retina以前のディスプレイと、互換のあるサイズ表記
  2. mainScreen applicationFrame height 528.000000
    1と同様だけど、ステータスバーを含まない高さであり、ステータスバーの状態によって値が変わる。この例は、着信ステータスバーがONになっている状態なので、1より40px少ない値になっている。
  3. mainScreen currentMode height 1136.000000
    物理的なpixel値。解像度の判定まで必要な場合は、この値を使うのが適切かもしれない。

SysStats Monitor/Liteでは、現在2を使っているので、ステータスバーの状態によって取得される値が変わってしまい、着信中やテザリング中にアプリが起動されると、正しく判定できていないことがわかりました。
今回の目的では1と3のどちらでもいいと思いますが、とりあえず1を採用し、以下の形でチェックすることにしました。

#define R4_DISPLAY_HEIGHT 568.0

+ (BOOL)is4InRetinaDisplay {
    
    if ([[UIScreen mainScreen] bounds].size.height == R4_DISPLAY_HEIGHT) {
        return YES;
    } else {
        return NO;
    }

}