基于BOOL定义常量

时间:2014-03-02 05:40:40

标签: ios macros constants retina-display

在我的iOS应用程序中,我有一个constants.h类,我定义了kBorderWidth。对于视网膜显示器,我希望这是.5使得边框为1像素厚,而在非视网膜显示器上,我希望它为1,使得它保持一个像素厚而不是更小。这是我现在的代码:

#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))

#if __IS_RETINA == 1
    #define kBorderWidth .5
#else
    #define kBorderWidth 1
#endif

编译得很好但是导致kBorderWidth为1.如何解决这个问题以便它完成我希望它做的事情?

2 个答案:

答案 0 :(得分:1)

我确定的解决方案是Lanorkin建议的解决方案,就是这样定义:

#define kBorderWidth (1.0 / [UIScreen mainScreen].scale)

这是未来的证明和简单,以及在我已经设置的constants.h文件中工作。

答案 1 :(得分:0)

您的“#define”宏:

#define IS_RETINA ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))

定义了一些在运行时执行的代码,而不是在编译时执行。

而不是:

#if __IS_RETINA == 1
    #define kBorderWidth .5
#else
    #define kBorderWidth 1
#endif

您应该设置运行时变量,例如:

static CGFloat gBorderWidth; // at the top of your .m file

或财产:

@property (readwrite) CGFloat borderWidth;

然后在viewDidLoad或viewWillAppear方法中设置它:

if(([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0)))
{
    self.borderWidth = 0.5f;
} else {
    self.borderWidth = 1.0f;
}

现在我意识到你想让它可用于许多视图控制器(例如因为它最初是在“constants.h”中),为什么不创建一个装饰器 singleton 类,它始终存在于应用程序的生命周期中,可以通过公开的属性控制应用程序的外观,例如“borderWidth”。

所以你可以通过以下方式访问它:

 AppearanceUtilityClass *appearance = [AppearanceUtilityClass sharedInstance];
 CGFloat borderWidth = appearance.borderWidth;