0

iPhone 4、iPhone 5、iPad用のユニバーサルアプリを書きたいです。

まず、iPad用のコードを開発しました。今度はそれを他のデバイスに移植したいと思います。

私はそのコードをファイルの先頭に書きました。デバッグすると、2番目の状態になることはありません。デバイスはiPhone4ですが、常にIS_IPAD条件の値を取ります。

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f)
#define IS_IPHONE_4 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0f)
#ifdef IS_IPAD
#define CELL_WIDTH 180
#define CELL_HEIGHT 123
#define CONTAINER_WIDTH 950
#define NUM_OF_ITEMS_IN_ROW 4
#define CONTAINER_LEFT_MARGIN 50
#define CONTAINER_TOP_MARGIN 70
#define CONTAINER_OUTER_TOP_MARGIN 0
#define CONTAINER_OUTER_LEFT_MARGIN 0
#define CELL_PADDING_RIGHT 32
#define CELL_PADDING_BOTTOM 20
#define MIN_CONTAINER_HEIGHT 450
#elif IS_IPHONE_4
#define IPAD_TO_IPHONE4 0.3
#define CELL_WIDTH 180 * IPAD_TO_IPHONE4
#define CELL_HEIGHT 123 * IPAD_TO_IPHONE4
#define CONTAINER_WIDTH 950 * IPAD_TO_IPHONE4
#define NUM_OF_ITEMS_IN_ROW 4
#define CONTAINER_LEFT_MARGIN 50 * IPAD_TO_IPHONE4
#define CONTAINER_TOP_MARGIN (70 * 0.3)
#define CONTAINER_OUTER_TOP_MARGIN 0 * IPAD_TO_IPHONE4
#define CONTAINER_OUTER_LEFT_MARGIN 0 * IPAD_TO_IPHONE4
#define CELL_PADDING_RIGHT 32 * IPAD_TO_IPHONE4
#define CELL_PADDING_BOTTOM 20 * IPAD_TO_IPHONE4
#define MIN_CONTAINER_HEIGHT 450 * IPAD_TO_IPHONE4
#endif

私はどこが間違っていますか?

4

1 に答える 1

2

ここでは、コンパイル時のチェックを行っています。プリプロセッサがこの行に到達したとき

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

その後、常に定義されますIS_IPAD。これが行うことは、プリプロセッサに、コードで見たときはいつでも、それを。に置き換える必要があることを伝えることです。そのコードは実行されず、1つのテキストが別のテキストに置き換えられるだけです。IS_IPAD(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

これは実行時チェックには問題ありません。つまり、コードで次のようなことを行うことができます。

if (IS_IPAD) {
    ...do something iPad-specific
}

ただし、プリプロセッサチェックは、コードがコンパイルされる前に発生するプリプロセッサチェック#if IS_IPAD#ifdef IS_IPADあるため、常に真です。つまり、アプリの実行中のデバイスではなく、コンパイル中にMacで実行されます。#if#ifdef

于 2013-03-25T23:20:58.413 に答える