0

我想为 iPhone 4、iPhone 5 和 iPad 编写一个通用应用程序。

首先,我为 iPad 开发代码。现在我想把它移植到其他设备上。

我在文件的顶部写了该代码。当我调试时,我发现它永远不会进入第二个条件。尽管设备是 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总是定义。它的作用是告诉预处理器,任何时候它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 回答