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_5了,因此SCREEN_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);
}

或如下 maddy 建议的那样

于 2012-11-14T23:30:05.583 回答
1

Try this define

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

任何以 开头的指令#都由预处理器处理;所以在应用程序甚至被编译之前。

现在您需要在定义中执行运行时代码;特别是 - [UIScreen mainScreen].bounds.size.height。显然,当应用程序尚未编译时,这不会被执行!

在大多数使用该#ifdef指令的桌面应用程序中,这是因为它是由预处理器在编译时根据#define通常位于主机源文件中的语句进行评估的。(也就是说,我将在 Mac OS X 机器上为 Mac OS X 编译代码,因此预处理器会在#define其他地方找到语句以允许它识别它的平台)

对于您正在做的事情,您将不得不在应用程序实际在设备上运行时检测屏幕尺寸;不在编译时间之前 - 因为在编译之后它可以在任何设备上运行。

底线是预处理器条件语句仅在编译时是有条件的——一旦应用程序被编译,它们就不能改变执行;它们就像您正在编译的任何其他代码一样变为“静态”。

于 2012-11-14T23:36:58.220 回答