2012-11-14 21 views
3

我寫道:的#ifdef如果設備是iPhone 5

#define IS_IPHONE_5 ([UIScreen mainScreen].bounds.size.height == 568.0) 

#ifdef IS_IPHONE_5 
#define SCREEN_HEIGHT 568 
#else 
#define SCREEN_HEIGHT 480 
#endif 

但它總是返回設備是iPhone 5的...我在做什麼錯?

+0

http://jayprakashdubey.blogspot.in/2014/09/check-device-for-iphone-5.html –

回答

12

IS_IPHONE_5宏就好了。你可以做這樣的事情:

if (IS_IPHONE_5) { 
    // do something specific for iPhone 5 
} 

在編譯時該代碼將被轉換爲:

if (([UIScreen mainScreen].bounds.size.height == 568.0)) { 
} 

的問題是你的SCREEN_HEIGHT宏。整個#ifdef塊將在編譯時進行評估。由於您確定了IS_IPHONE_5,因此SCREEN_HEIGHT將始終設置爲568.

您希望運行時確定屏幕高度。您可以得到這樣的:

[UIScreen mainScreen].bounds.size.height 
2

屏幕高度檢查必須在運行時完成。 #ifdef IS_IPHONE_5不會在運行時進行評估,而是預編譯時間。您可以調用屏幕高度代碼作爲課程運行時方法的一部分。

你可能只是做類似

- (BOOL) isIphone5 
{ 
    return ([UIScreen mainScreen].bounds.size.height == 568.0); 
} 

或暗示馬迪下面

+0

我可以使用其他一些預處理器語句來檢查設備是否是iPhone 5? – 1337code

+0

'IS_IPHONE_5'宏很好。這是'SCREEN_HEIGHT'宏,這是一個問題。 – rmaddy

+0

不,在編譯源代碼之前先處理預處理器指令 - 因此無法確定您的應用程序在哪個手機上運行。因此,您必須按照回答者的建議檢查手機。 –

1

任何與#開始指令由預處理器處理;所以在應用程序被編譯之前。

現在你需要運行時代碼在你的定義將被執行;具體爲 - [UIScreen mainScreen].bounds.size.height。顯然這是不會執行時,應用程序甚至沒有編譯!

在大多數桌面應用中使用#ifdef指令,這是因爲它是由在編譯時預處理從通常位於源文件中的主機上#define報表進行評估。 (也就是說,我將在Mac OS X機器上編譯Mac OS X的代碼,因此預處理器會在其他地方找到#define聲明以允許它識別它的平臺)

對於您在做什麼當應用程序實際在設備上運行時,必須檢測屏幕大小;而不是在編譯之前 - 因爲在編譯之後它可以在任何設備上運行。

底線是預處理條件語句只是有條件在編譯時 - 一旦某個應用已編制都無法改變的執行;它們就像你正在編譯的其他代碼一樣變成「靜態」。

+0

對不起,'#define'就這麼簡單。看到我的答案爲什麼。 – rmaddy

+0

是'''#define''是 - 但是當它被用於條件預處理器語句時。整個'''#ifdef''' /'''#ifndef''想法不會在編譯之前進行評估,而不是在運行時進行評估。這是問題。否則就是完全混淆了這個問題 - 正如我在文章中明確指出的那樣,預處理程序**條件語句**僅在編譯時有條件;不是定義 - 而是實際的條件陳述。 –

+0

對,查看我的答案。我解釋了這一點。 – rmaddy

1

試試這個定義

#define IS_IPHONE_5 (fabs((double)[ [ UIScreen mainScreen ] bounds ].size.height - (double)568) < DBL_EPSILON)