web-dev-qa-db-ja.com

iOSはプログラムで物理的な画面サイズを取得しますか?

これは可能ですか?ピクセル数ではなく、インチ数が必要です。約160 ppiです。しかし、そうではありません。

34

使用可能な場合は、 IScreen または IDevice にありますが、存在しません。

EricaのUIDevice-extension の情報と、リストされた各デバイスの仕様から推測できます ここWikipediaで

9
progrmr

これを提供するAPIはありません。最善の策は、デバイスの画面サイズ(ポイント単位)とiPadやiPhoneなどの場合はその推測から見て、画面サイズにハードコードされた値を使用することです。

画面サイズを取得するコードを次に示します。

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;

デバイスの向きによっては、幅と高さが入れ替わる場合があることに注意してください。

53
occulus

デバイスの画面サイズを推定する簡単な方法を次に示します。最新のデバイスについては更新されていますが、将来のデバイスでは失敗する可能性があります(すべての推測方法がそうであるように)。デバイスがミラー化されている場合も混乱します(ミラー化された画面サイズではなく、デバイスの画面サイズを返します)

#define SCREEN_SIZE_IPHONE_CLASSIC 3.5
#define SCREEN_SIZE_IPHONE_TALL 4.0
#define SCREEN_SIZE_IPAD_CLASSIC 9.7

+ (CGFloat)screenPhysicalSize
{
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        CGSize result = [[UIScreen mainScreen] bounds].size;
        if (result.height < 500)
            return SCREEN_SIZE_IPHONE_CLASSIC;  // iPhone 4S / 4th Gen iPod Touch or earlier
        else
            return SCREEN_SIZE_IPHONE_TALL;  // iPhone 5
    }
    else
    {
        return SCREEN_SIZE_IPAD_CLASSIC; // iPad
    }
} 
4
Jeff Hay

使用する必要があるかもしれません[UIScreen mainScreen].scale;

CGFloat scale = [UIScreen mainScreen].scale;
CGRect screenRect = [[UIScreen mainScreen] bounds];

CGFloat physicalWidth = screenRect.size.width * scale;
CGFloat physicalHeight = screenRect.size.height * scale;
3
aelam

おそらく、Jeff HayのコードはiPad Miniを含むように適合させることができます。秘trickは、デバイスのモデル識別子を取得することです。最新の非網膜iPadは「iPad2,4」で、最初のiPad miniは「iPad2,5」です。ここで確認する必要があるのは、画面のスケーリングが1.0(非網膜)かどうかだけです

このコードは将来にわたって使用できるわけではありませんが、モデル識別子のルールをいつでも追加できます。

#import <sys/utsname.h>

#define SCREEN_SIZE_IPAD_MINI 7.9

    struct utsname systemInfo;
    uname(&systemInfo);
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && strcasecmp(systemInfo.machine, "iPad2,5") >= 0 [[UIScreen mainScreen] scale] == 1.0)
        return SCREEN_SIZE_IPAD_MINI
0
philtre

私が使用する「式」は

#define IS_iPhone5 ( fabs( (double)[ [ UIScreen mainScreen ] bounds ].size.height - (double)568 ) < DBL_EPSILON )
0
Tiago Sousa

この質問を聞いたので、この問題を処理するためのオープンソースライブラリ IRLSize を作成しました。どちらの方向でも使用できます:実際のサイズでビュー(または画面全体)のサイズを測定するか、サイズをsetで測定します特定の実世界の次元へのビューの。

0
Jeff Kelley