我已经阅读了#if和#define语句的许多定义 我尝试使用我读取的方式,但只有错误“预处理程序表达式启动时无效的令牌”在将其定义为以下注释的行上:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#define is_ipad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define is_ipad_hd ( (is_ipad == 1 && [UIScreen mainScreen].bounds.size.width > 1024 ) ? YES : NO)
#define is_iphone_hd ([UIScreen mainScreen].bounds.size.width > 480 ? YES : NO)
#define device_width 480.0f
#define device_height 320.0f
#if (is_ipad_hd == YES) // Error here
#define device_width = 2048.0f
#define device_height = 1496.0f
#endif
为什么它适用于简单的教程,当我们尝试更复杂的事情时,这些事情就会发生!
答案 0 :(得分:5)
这些是预处理程序指令,因此您无权访问[UIScreen mainScreen]方法和编译时定义的所有其他对象!
答案 1 :(得分:1)
宏评估在编译时发生。
但是,(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
或[UIScreen mainScreen]
只能在运行时进行解释。
除此之外,你不应该依赖屏幕尺寸来为你做脏活。您应该依赖于用户界面惯用法和主屏幕的比例:
BOOL isiPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad;
BOOL isHD = [[UIScreen mainScreen] scale] == 2.0;
if (isiPad) {
if (isHD) {
// retina iPad
} else {
// non-retina iPad
}
} else {
if (isHD) {
// retina iPhone/iPod touch
} else {
// non-retina iPhone/iPod touch
}
}
答案 2 :(得分:0)
在这里与其他人达成一致虽然我对C预处理器的熟悉程度不高,但是快速的谷歌搜索回来了:
表达式是整数类型的C表达式,受到严格的限制。它可能包含.... 比我在source.
上快速实现的格式要好得多