私が書いた:
#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であることを返します...私は何が間違っているのですか?
私が書いた:
#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であることを返します...私は何が間違っているのですか?
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_5
、SCREEN_HEIGHT
は常に568に設定されます。
画面の高さを実行時に決定する必要があります。これは次の場所から入手できます。
[UIScreen mainScreen].bounds.size.height
画面の高さのチェックは、実行時に実行する必要があります。#ifdef IS_IPHONE_5は実行時に評価されませんが、コンパイル前に評価されます。クラスのランタイムメソッドの一部として画面の高さコードを呼び出すことができます。
あなたはただのようなことをすることができます
- (BOOL) isIphone5
{
return ([UIScreen mainScreen].bounds.size.height == 568.0);
}
またはマディが以下に示唆するように
で始まるディレクティブ#
はすべて、プリプロセッサによって処理されます。したがって、アプリケーションがコンパイルされる前ですら。
ここで、定義で実行時コードを実行する必要があります。具体的には- [UIScreen mainScreen].bounds.size.height
。明らかに、アプリがまだコンパイルされていない場合、これは実行されません!
ディレクティブが使用されるほとんどのデスクトップアプリケーションでは、通常、ホストマシンのソースファイルにあるステートメント#ifdef
からコンパイル時にプリプロセッサによって評価されるためです。#define
(つまり、MacOSXマシンでMacOSXのコードをコンパイルするので、プリプロセッサは#define
他の場所でステートメントを見つけて、プラットフォームを認識できるようにします)
あなたが見ていることについては、アプリが実際にデバイス上で実行されているときに画面サイズを検出する必要があります。コンパイル時より前ではありません-コンパイル後は、どのデバイスでも実行できます。
つまり、プリプロセッサの条件付きステートメントはコンパイル時にのみ条件付きです。アプリがコンパイルされると、実行を変更することはできません。コンパイルしている他のコードと同じように、それらは「静的」になります。
この定義を試してください
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )