你 「#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
‘),爲什麼不創造一種裝飾單類,這是始終存在了您的應用程序的壽命,並且可以通過公開的屬性,如’borderWidth
」一個控制你的應用程序的外觀。
AppearanceUtilityClass *appearance = [AppearanceUtilityClass sharedInstance];
CGFloat borderWidth = appearance.borderWidth;
儘管我同意邁克爾的回答,並且通常更好的方式是使用singleton而不是#define來處理這種情況,但您可能希望使用類似'#define kBorderWidth(1.0/[UIScreen mainScreen] .scale)'這應該提供即使對於futuretina顯示,也是1px。 – Lanorkin