如何定义使用另一个作为条件的预处理器宏?

时间:2016-11-18 02:53:39

标签: ios objective-c macros

我有一个游戏,它使用一些常见的宏来确定用户所使用的设备:

#define IS_IPAD      (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE    (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_4  (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0f)
#define IS_IPHONE_5  (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f)
#define IS_IPHONE_6  (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0f)
#define IS_IPHONE_6P (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0f)

这是一款较旧的游戏,我只想用倍增器调整一些定位。一个宏是理想的:

#ifdef IS_IPHONE_6
#define SIZEMOD 1.172f
#elif IS_IPHONE_6P
#define SIZEMOD 1.6875f
#else
#define SIZEMOD 1.0f
#endif

不幸的是,这会检查是否定义了宏IS_IPHONE_6,这将始终为真,因此在其他设备上使用了错误的乘数。如何使用宏正确定义SIZEMOD

2 个答案:

答案 0 :(得分:2)

我希望我不会因为这个而被投入地狱

#define IS_IPAD      (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE    (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_4  (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0f)
#define IS_IPHONE_5  (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f)
#define IS_IPHONE_6  (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0f)
#define IS_IPHONE_6P (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0f)

#define (SIZEMOD IS_IPHONE_6 ? 1.172f : IS_IPHONE_6P ? 1.6875f : 1.0)

答案 1 :(得分:0)

我更好的方法是使用适当的功能。这是我经常使用的东西,它运作良好并支持所有已知的iOS模型。

https://github.com/duhovny/DeviceHardware