ios - 在 if/else 语句中使用宏(定义)?没有重新定义的错误
问题描述
我知道这不是一种好的编码方式,但是我只是在制作我正在开发的游戏的过程中Obj-C
,Swift
但是我试图让它在我的设备上正确运行,这样我就可以回去了参考一切。
所以,这实际上是一个临时措施!我定义了几个宏,
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
它们在代码中被引用,在我真的无法拆分 if/else 语句的区域中,因此想要有效地调试使用;
if(IS_IPHONE_OLD)
{
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
}
else if (IS_IPHONE_5)
{
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
}
else if (IS_IPHONE_6_6S_6P_6SP_7_8)
{
#define BTNNUMBER_W 30
#define BTNNUMBER_H 30
NSLog(@"iPhone 6 to 8");
}
else if (IS_IPHONE_7P_8P)
{
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
NSLog(@"iPhone 7P to 8P");
}
else if (IS_IPHONE_X)
{
#define BTNNUMBER_W 110
#define BTNNUMBER_H 110
}
正如已经说过的,这实际上只是为了再次“让它工作”,而我重新做这一切,但任何指针都会非常有义务!
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IDIOM UI_USER_INTERFACE_IDIOM()
#define IPAD UIUserInterfaceIdiomPad
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_IPHONE_OLD (IS_IPHONE && SCREEN_MAX_LENGTH == 480.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6_6S_6P_6SP_7_8 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_7P_8P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
#define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0)
解决方案
在 C 和 Objective-C 中,使用预处理器#if
而不是编程语言if
:
#if IS_IPHONE_OLD || IS_IPHONE_5
#define BTNNUMBER_W 60
#define BTNNUMBER_H 60
#elif IS_IPHONE_6_6S_6P_6SP_7_8
#define BTNNUMBER_W 30
#define BTNNUMBER_H 30
// …
#endif
但是,这不起作用,因为您的IS_IPHONE_OLD
etc. 不是编译时常量(也不能,因为同一个应用程序可以在多部手机上运行)。预处理器进行简单的文本替换,所有这些都发生在任何代码甚至被解析之前(因此是预处理器)。
你不能在运行时影响预处理器宏,但你只能在运行时知道屏幕大小……</p>
相反,将您的宏切换为同名的变量:
CGFloat BTNNUMBER_W;
CGFloat BTNNUMBER_H;
然后在使用它们之前运行的某些函数中,分配它们的值:
if (IS_IPHONE_OLD || IS_IPHONE_5) {
BTNNUMBER_W = 60;
BTNNUMBER_H = 60;
} // …
或者,将您的变量命名为更好的名称,然后:
#define BTNNUMBER_W ([[AppDelegate instance] buttonNumberWidth])
在 Swift 中,使用计算属性:
static var buttonNumberWidth: CGFloat {
let screenWidth = UIScreen.main.bounds.size.width
if screenWidth <= 480 {
return 30
} // …
}
static var buttonNumberHeight: CGFloat { buttonNumberWidth }
推荐阅读
- php - 如何正确获取 url 中的元素
- chef-infra - 厨师测试厨房
- google-apps-script - CalendarApp.getDefaultCalendar().getEvents() 返回 CalendarApp.getEventById() 无法访问的事件
- java - 使用 Java 的执行时间
- c# - IHttpActionResult NotFound() 不工作
- c# - 如何动态构建 HTML 表格作为发送电子邮件的模板(ng-repeat)
- ios - 在常规尺寸的 iPhone 上与 UIPopoverPresentationController 的内容进行交互?
- django - Freezegun always causes RuntimeWarning of receiving naive datetime
- html - 代理授权:
? - image - Postscript 在循环中显示图像后退出