2011-04-14 97 views
2

我在檢測iOS設備上的視網膜顯示時出現問題。我使用的是建議由不同的人下面的代碼:iOS視網膜顯示檢測代碼不起作用

BOOL isRetina() 
{ 
    UIScreen* s = [UIScreen mainScreen]; 
    if ([s respondsToSelector:@selector(displayLinkWithTarget:selector:)] && 
     [s respondsToSelector:@selector(scale)]) 
    { 
     CGFloat scale = [s scale]; 
     return scale == 2.0; 
    } 

    return NO; 
} 

的問題是,它編譯罰款部署目標的iOS 4或更高,但是當我編譯iOS3.2我得到一個「不兼容類型在初始化「錯誤在」scale = [s scale]「行,因爲我試圖將一個id分配給一個浮點數。我找不到任何關於此的信息。由於其他人似乎都在使用這種方法,我必須在這裏錯過一些非常明顯的東西?順便說一下,使用XCode 4的Base SDK版本是4.3。

這裏是我的BaseSDK /部署目標設置: SDK settings

更新:我已經解決了它。基本上問題是一些XCode問題。要解決一些其他問題,我必須卸載並重新安裝XCode。之後,行爲消失了。

+0

而只是將結果投入浮動不起作用? (即''CGFloat scale =(CGFloat)[s scale];') – jv42 2011-04-14 14:09:56

+0

不,您不能將指針類型轉換爲浮點型。我已經嘗試過了。甚至試圖通過無效*。 – Gottfried 2011-04-14 14:34:34

+0

當然,因爲我有一段時間不在ObjC,所以我忘記了它的一些內在細節。祝你好運! – jv42 2011-04-14 15:03:13

回答

1

在iOS 3.2中,未定義符號-[UIScreen scale],因此編譯器假定在使用iOS SDK 3.2編譯時默認返回id。因此警告。

理解SDK against which you compile and the deployment target的區別非常重要。您通常希望針對最新的SDK編譯,但您設置了一個部署目標您希望支持的最低iOS版本。

+0

這是有趣的事情,我已經知道:我的基礎SDK設置爲4.3。我的部署目標是3.2。但是,當我選擇爲例如在XCode的iPad 3.2模擬器,然後我得到這個錯誤。 – Gottfried 2011-04-14 14:26:48

+1

@Gottfried:這是因爲在這種情況下,Base SDK設置爲3.2。 – DarkDust 2011-04-14 14:37:08

+0

我附上了我的Base SDK設置的截圖。他們似乎沒問題。 – Gottfried 2011-04-14 14:49:10

1

這裏是我使用的代碼,工程早在3.1(我沒有早於測試):

BOOL isRetina; 
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2){ 
    isRetina = YES; 
} else { 
    isRetina = NO; 
} 

正如指出的@DarkDust這個問題是不是真的是你的代碼(儘管上面應該對你更簡單),這是你試圖編譯爲3.2,真的你應該只是將你的部署目標設置爲3.2,仍然使用最新的SDK編譯。

不同之處在於,當您爲較舊的SDK進行編譯時,它將無法生成,因爲它知道它無法調用該方法(scale) - 即使它實際上不會到達該行代碼。但是,如果您已經正確設置了部署目標,則可以在3.2上使用您的代碼,而不必擔心,因爲您知道scale方法永遠不會被調用,因爲您已驗證它不存在。

+0

請閱讀我的評論@DarkDust。基本上我意識到,不知何故Xcode構建使用3.2作爲基礎sdk,但在我的Xcode設置它說基本sdk 4.3,部署目標3.2。但我確信自從我切換到XCode 4後我錯過了一些東西我有點困惑:) – Gottfried 2011-04-14 14:33:42