我写:
#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);
}
或如下 maddy 建议的那样
Try this define
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
任何以 开头的指令#
都由预处理器处理;所以在应用程序甚至被编译之前。
现在您需要在定义中执行运行时代码;特别是 - [UIScreen mainScreen].bounds.size.height
。显然,当应用程序尚未编译时,这不会被执行!
在大多数使用该#ifdef
指令的桌面应用程序中,这是因为它是由预处理器在编译时根据#define
通常位于主机源文件中的语句进行评估的。(也就是说,我将在 Mac OS X 机器上为 Mac OS X 编译代码,因此预处理器会在#define
其他地方找到语句以允许它识别它的平台)
对于您正在做的事情,您将不得不在应用程序实际在设备上运行时检测屏幕尺寸;不在编译时间之前 - 因为在编译之后它可以在任何设备上运行。
底线是预处理器条件语句仅在编译时是有条件的——一旦应用程序被编译,它们就不能改变执行;它们就像您正在编译的任何其他代码一样变为“静态”。