3

私が書いた:

#define IS_IPHONE_5 ([UIScreen mainScreen].bounds.size.height == 568.0)

#ifdef IS_IPHONE_5
#define SCREEN_HEIGHT 568
#else
#define SCREEN_HEIGHT 480
#endif

しかし、それは常にそのデバイスがiPhone 5であることを返します...私は何が間違っているのですか?

4

4 に答える 4

12

IS_IPHONE_5マクロは問題ありません。あなたはこのようなことをすることができます:

if (IS_IPHONE_5) {
    // do something specific for iPhone 5
}

コンパイル時に、このコードは次のように変換されます。

if (([UIScreen mainScreen].bounds.size.height == 568.0)) {
}

問題はSCREEN_HEIGHTマクロです。ブロック全体#ifdefがコンパイル時に評価されます。を定義したのでIS_IPHONE_5SCREEN_HEIGHTは常に568に設定されます。

画面の高さを実行時に決定する必要があります。これは次の場所から入手できます。

[UIScreen mainScreen].bounds.size.height
于 2012-11-14T23:38:08.997 に答える
2

画面の高さのチェックは、実行時に実行する必要があります。#ifdef IS_IPHONE_5は実行時に評価されませんが、コンパイル前に評価されます。クラスのランタイムメソッドの一部として画面の高さコードを呼び出すことができます。

あなたはただのようなことをすることができます

- (BOOL) isIphone5
{
    return ([UIScreen mainScreen].bounds.size.height == 568.0);
}

またはマディが以下に示唆するように

于 2012-11-14T23:30:05.583 に答える
1

で始まるディレクティブ#はすべて、プリプロセッサによって処理されます。したがって、アプリケーションがコンパイルされる前ですら。

ここで、定義で実行時コードを実行する必要があります。具体的には- [UIScreen mainScreen].bounds.size.height。明らかに、アプリがまだコンパイルされていない場合、これは実行されません!

ディレクティブが使用されるほとんどのデスクトップアプリケーションでは、通常、ホストマシンのソースファイルにあるステートメント#ifdefからコンパイル時にプリプロセッサによって評価されるためです。#define(つまり、MacOSXマシンでMacOSXのコードをコンパイルするので、プリプロセッサは#define他の場所でステートメントを見つけて、プラットフォームを認識できるようにします)

あなたが見ていることについては、アプリが実際にデバイス上で実行されているときに画面サイズを検出する必要があります。コンパイル時より前ではありません-コンパイル後は、どのデバイスでも実行できます。

つまり、プリプロセッサの条件付きステートメントはコンパイル時にのみ条件付きです。アプリがコンパイルされると、実行を変更することはできません。コンパイルしている他のコードと同じように、それらは「静的」になります。

于 2012-11-14T23:36:58.220 に答える
1

この定義を試してください

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
于 2013-09-09T09:21:11.860 に答える