我希望根据不同的设备高度动态定义常量。 我尝试使用此代码,但它不起作用:
#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.这有什么问题?
答案 0 :(得分:2)
您无法在宏定义中运行代码,它是在编译时发生的简单文本替换过程。因此,您不知道此时设备的特性是什么,因为您 目标设备。
如果你想使用类似[UIDevice currentDevice] userInterfaceIdiom
的东西,你必须在运行时评估它,而不是在编译时宏中,例如:
int kColumnHeightPortrait568 = 548;
if (([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPhone)
|| ([UIScreen mainScreen].bounds.size.height != 568))
{
kColumnHeightPortrait568 = (IS_IPAD ? 984 : 460);
}
答案 1 :(得分:1)
#ifdef
用于检查是否定义了宏。当您在第一行定义isPhone568
时,#ifdef isPhone568
将为真。
如果要测试表达式的值而不是宏的存在,则应使用#if
代替。但是#if
只能测试简单的算术表达式,就像 paxdiablo 提到的那样,“你不能在宏定义中运行代码”。