#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的...我在做什麼錯?
#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的...我在做什麼錯?
你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
屏幕高度檢查必須在運行時完成。 #ifdef IS_IPHONE_5不會在運行時進行評估,而是預編譯時間。您可以調用屏幕高度代碼作爲課程運行時方法的一部分。
你可能只是做類似
- (BOOL) isIphone5
{
return ([UIScreen mainScreen].bounds.size.height == 568.0);
}
或暗示馬迪下面
任何與#
開始指令由預處理器處理;所以在應用程序被編譯之前。
現在你需要運行時代碼在你的定義將被執行;具體爲 - [UIScreen mainScreen].bounds.size.height
。顯然這是不會執行時,應用程序甚至沒有編譯!
在大多數桌面應用中使用#ifdef
指令,這是因爲它是由在編譯時預處理從通常位於源文件中的主機上#define
報表進行評估。 (也就是說,我將在Mac OS X機器上編譯Mac OS X的代碼,因此預處理器會在其他地方找到#define
聲明以允許它識別它的平臺)
對於您在做什麼當應用程序實際在設備上運行時,必須檢測屏幕大小;而不是在編譯之前 - 因爲在編譯之後它可以在任何設備上運行。
底線是預處理條件語句只是有條件在編譯時 - 一旦某個應用已編制都無法改變的執行;它們就像你正在編譯的其他代碼一樣變成「靜態」。
試試這個定義
#define IS_IPHONE_5 (fabs((double)[ [ UIScreen mainScreen ] bounds ].size.height - (double)568) < DBL_EPSILON)
http://jayprakashdubey.blogspot.in/2014/09/check-device-for-iphone-5.html –