1

さまざまなデバイスの高さに基づいて定数を動的に定義したいと思います。このコードを使おうとしましたが、機能しません。

#define isPhone568 ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bounds.size.height == 568)

#ifdef isPhone568
    #define kColumnHeightPortrait568 548
#else
    #define kColumnHeightPortrait568 (IS_IPAD ? 984 : 460)
#endif

3.5インチのシミュレーターを使用している場合でも、548が表示されます。これの何が問題になっていますか?

4

2 に答える 2

2

マクロ定義でコードを実行することはできません。これは、コンパイル時に発生する単純なテキスト置換プロセスです。したがって、ターゲットデバイスを使用ていないため、その時点でのデバイスの特性はわかりません。

のようなものを使用する場合は、コンパイル時のマクロではなく、実行時[UIDevice currentDevice] userInterfaceIdiomに評価する必要があります。

int kColumnHeightPortrait568 = 548;
if (([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPhone)
   || ([UIScreen mainScreen].bounds.size.height != 568))
{
    kColumnHeightPortrait568 = (IS_IPAD ? 984 : 460);
}
于 2012-09-21T09:10:55.573 に答える
1

#ifdef、マクロが定義されているかどうかを確認するために使用されます。isPhone568最初の行で定義したように、 #ifdef isPhone568trueになります。

マクロの存在ではなく式の値をテストする場合は、#if代わりにを使用する必要があります。しかし、 paxdiabloが「マクロ定義でコードを実行することはできません」と述べたように#if、単純な算術式しかテストできません。

于 2012-09-21T09:40:39.167 に答える