在我的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.如何解决这个问题以便它完成我希望它做的事情?
答案 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;