簡體   English   中英

使用宏檢測iPhone6和iPhone6 Plus

[英]Detecting iPhone6 & iPhone6 Plus using macros

我試圖檢測當前的設備是iPhone5,iPhone6還是iPhone 6 Plus。

在我的應用程序中,我已經使用這個宏來檢測完美的iPhone 5。

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

同樣,我使用此宏來檢測iPhone 6和iPhone 6 Plus。

#define IS_IPHONE_6      (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)667) < DBL_EPSILON)
#define IS_IPHONE_6_PLUS (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)736) < DBL_EPSILON)

IS_IPHONE_5宏以任何方向按預期工作。

我的問題是當設備保存在LANDSCAPE中時,IS_IPHONE_6和IS_IPHONE_6_PLUS宏不會返回true。 但是,當設備在PORTRAIT中保存時,它們確實可以正常工作。 是什么賦予了?

如果有人有更好的建議來檢測iPhone5,6和6 Plus請分享。

這是針對iOS系統版本和SDK版本的任何組合進行測試和設計的

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)

#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))

#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)

注意:如果iPhone 6處於縮放模式,則UI是iPhone 5的放大版本。這反映在宏中。

用法: http//pastie.org/9687735

不要使用屏幕尺寸,最好使用硬件型號。 我們每年都會獲得越來越多的屏幕尺寸,您在代碼中硬編碼屏幕尺寸越少,對您未來的自我感覺就越好。

您需要一個輔助函數來獲取計算機名稱。 我正在使用dispatch_once來避免多次查詢系統以獲取不會發生變化的數據。

NSString* machineName()
{
    static NSString* name = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        struct utsname systemInfo;
        uname(&systemInfo);
        name = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    });
    return name;
}

然后根據需要定義一些宏:

#define IS_IPHONE_6      [machineName() isEqualToString:@"iPhone7,2"]
#define IS_IPHONE_6_PLUS [machineName() isEqualToString:@"iPhone7,1"]

對於某些型號來說比較棘手:

#define IS_IPHONE_5s     [machineName() hasPrefix:@"iPhone6,"]

最后,在代碼中使用宏:

if (IS_IPHONE_6) {
// for the 6
}

注意:這回答了你的問題(用宏檢測模型),但你做錯了恕我直言。 你應該使用autolayout和size類,除非你支持真正的舊iOS版本......

看看這個答案: iOS - 如何獲得設備制造和型號? 它不使用宏,但它完成了這項工作。 我已經看到一些類似的宏檢測iPhone 6和iPhone 6 plus的問題。 所以從@Ohhmee那里嘗試答案會更好

編輯:當然可能有一個解決方案用宏檢測它。 但我不知道,我找不到解決方案所以我建議采用不同的方法。

你的宏很荒謬,似乎表明了對浮點運算的恐懼。

#define IS_IPHONE_5      ([UIScreen mainScreen].bounds.size.height == 568)
#define IS_IPHONE_6      ([UIScreen mainScreen].bounds.size.height == 667)
#define IS_IPHONE_6_PLUS ([UIScreen mainScreen].bounds.size.height == 736)

將同樣好(或同樣壞)。 他們很可能會像壞人一樣工作。

如果您對iPhone 6或6+的功能感興趣,請檢查功能,而不是屏幕尺寸。 蘋果很快就會推出一款具有所有iPhone 6功能的4英寸手機。或者是具有大屏幕但沒有iPhone 6功能的廉價6c手機。

對於用戶界面等,只需獲取主屏幕邊界並相應地布置視圖。 在這一點上,固定大小的硬編碼絕對是荒謬的,會咬你。 你應該能夠在沒有問題的12英寸iPad屏幕上運行,並且天知道將會是什么屏幕尺寸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM