2014-03-02 46 views
2

在我的iOS應用程序中,我有一個constants.h類,其中我定義了kBorderWidth。對於視網膜顯示器,我希望這是0.5,以使邊界爲1像素厚,而在非視網膜顯示器上,我希望它爲1,以便它保持一個像素厚而不是更少。這是我的代碼現在:定義基於BOOL的常量

#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。我怎樣才能解決這個問題,以便它完成,我想它做什麼?

+1

儘管我同意邁克爾的回答,並且通常更好的方式是使用singleton而不是#define來處理這種情況,但您可能希望使用類似'#define kBorderWidth(1.0/[UIScreen mainScreen] .scale)'這應該提供即使對於futuretina顯示,也是1px。 – Lanorkin

回答

1

,我定居在是一個由Lanorkin提出這是定義它像這樣的解決方案:

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

這是未來

所以,你可以通過類似訪問證明和簡單,以及在我已經設置的constants.h文件中工作。

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‘),爲什麼不創造一種裝飾類,這是始終存在了您的應用程序的壽命,並且可以通過公開的屬性,如’borderWidth」一個控制你的應用程序的外觀。

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

我開始了一個類似的答案,然後意識到'kBorderWidth'正在constants.h文件中定義,這意味着該變量應該在任何導入.h的類中可用。您的解決方案僅適用於單個.m文件。 – rmaddy

+0

bleah ......這很噁心。好的。我會盡量重新回答我的答案。 –