首先獲取設(shè)備型號 APP版本的操作
? ??// 獲取當(dāng)前App的基本信息字典
? ? NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
? ? //app名稱
? ? NSString *app_Name? ? ? ? = [infoDictionary objectForKey:@"CFBundleDisplayName"];
? ? // app版本
? ? NSString *app_Version ? ? = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
? ? // app build版本
? ? NSString *app_build ? ? ? = [infoDictionary objectForKey:@"CFBundleVersion"];
? ? //手機(jī)別名: 用戶定義的名稱
? ? NSString* userPhoneName ? = [[UIDevice currentDevice] name];
? ? //設(shè)備名稱
? ? NSString* deviceName? ? ? = [[UIDevice currentDevice] systemName];
? ? //手機(jī)系統(tǒng)版本
? ? NSString* phoneVersion? ? = [[UIDevice currentDevice] systemVersion];
? ? //手機(jī)型號
? ? NSString* phoneModel? ? ? = [[UIDevice currentDevice] model];
? ? //地方型號? (國際化區(qū)域名稱)
? ? NSString* localPhoneModel = [[UIDevice currentDevice] localizedModel];
下面便是獲取手機(jī)的型號
從下面開始的方法戈轿,都要引用下面這個庫(iOS 12 系統(tǒng)還沒有更新暂论,不知道iPhone XS、iPhone XS Max椿浓、iPhone XR 的機(jī)型)
//需要導(dǎo)入頭文件:#import <sys/utsname.h>
- (NSString*)iphoneType {
struct utsname systemInfo;
uname(&systemInfo);
NSString*platform = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];
if([platform isEqualToString:@"iPhone1,1"]) ?return@"iPhone 2G";
if([platform isEqualToString:@"iPhone1,2"]) ?return@"iPhone 3G";
if([platform isEqualToString:@"iPhone2,1"]) ?return@"iPhone 3GS";
if([platform isEqualToString:@"iPhone3,1"]) ?return@"iPhone 4";
if([platform isEqualToString:@"iPhone3,2"]) ?return@"iPhone 4";
if([platform isEqualToString:@"iPhone3,3"]) ?return@"iPhone 4";
if([platform isEqualToString:@"iPhone4,1"]) ?return@"iPhone 4S";
if([platform isEqualToString:@"iPhone5,1"]) ?return@"iPhone 5";
if([platform isEqualToString:@"iPhone5,2"]) ?return@"iPhone 5";
if([platform isEqualToString:@"iPhone5,3"]) ?return@"iPhone 5c";
if([platform isEqualToString:@"iPhone5,4"]) ?return@"iPhone 5c";
if([platform isEqualToString:@"iPhone6,1"]) ?return@"iPhone 5s";
if([platform isEqualToString:@"iPhone6,2"]) ?return@"iPhone 5s";
if([platform isEqualToString:@"iPhone7,1"]) ?return@"iPhone 6 Plus";
if([platform isEqualToString:@"iPhone7,2"]) ?return@"iPhone 6";
if([platform isEqualToString:@"iPhone8,1"]) ?return@"iPhone 6s";
if([platform isEqualToString:@"iPhone8,2"]) ?return@"iPhone 6s Plus";
if([platform isEqualToString:@"iPhone8,4"]) ?return@"iPhone SE";
if([platform isEqualToString:@"iPhone9,1"]) ?return@"iPhone 7";
if([platform isEqualToString:@"iPhone9,2"]) ?return@"iPhone 7 Plus";
if([platform isEqualToString:@"iPhone10,1"]) return@"iPhone 8";
if([platform isEqualToString:@"iPhone10,4"]) return@"iPhone 8";
if([platform isEqualToString:@"iPhone10,2"]) return@"iPhone 8 Plus";
if([platform isEqualToString:@"iPhone10,5"]) return@"iPhone 8 Plus";
if([platform isEqualToString:@"iPhone10,3"]) return@"iPhone X";
if([platform isEqualToString:@"iPhone10,6"]) return@"iPhone X";
if([platform isEqualToString:@"iPod1,1"]) ?return@"iPod Touch 1G";
if([platform isEqualToString:@"iPod2,1"]) ?return@"iPod Touch 2G";
if([platform isEqualToString:@"iPod3,1"]) ?return@"iPod Touch 3G";
if([platform isEqualToString:@"iPod4,1"]) ?return@"iPod Touch 4G";
if([platform isEqualToString:@"iPod5,1"]) ?return@"iPod Touch 5G";
if([platform isEqualToString:@"iPad1,1"]) ?return@"iPad 1G";
if([platform isEqualToString:@"iPad2,1"]) ?return@"iPad 2";
if([platform isEqualToString:@"iPad2,2"]) ?return@"iPad 2";
if([platform isEqualToString:@"iPad2,3"]) ?return@"iPad 2";
if([platform isEqualToString:@"iPad2,4"]) ?return@"iPad 2";
if([platform isEqualToString:@"iPad2,5"]) ?return@"iPad Mini 1G";
if([platform isEqualToString:@"iPad2,6"]) ?return@"iPad Mini 1G";
if([platform isEqualToString:@"iPad2,7"]) ?return@"iPad Mini 1G";
if([platform isEqualToString:@"iPad3,1"]) ?return@"iPad 3";
if([platform isEqualToString:@"iPad3,2"]) ?return@"iPad 3";
if([platform isEqualToString:@"iPad3,3"]) ?return@"iPad 3";
if([platform isEqualToString:@"iPad3,4"]) ?return@"iPad 4";
if([platform isEqualToString:@"iPad3,5"]) ?return@"iPad 4";
if([platform isEqualToString:@"iPad3,6"]) ?return@"iPad 4";
if([platform isEqualToString:@"iPad4,1"]) ?return@"iPad Air";
if([platform isEqualToString:@"iPad4,2"]) ?return@"iPad Air";
if([platform isEqualToString:@"iPad4,3"]) ?return@"iPad Air";
if([platform isEqualToString:@"iPad4,4"]) ?return@"iPad Mini 2G";
if([platform isEqualToString:@"iPad4,5"]) ?return@"iPad Mini 2G";
if([platform isEqualToString:@"iPad4,6"]) ?return@"iPad Mini 2G";
if([platform isEqualToString:@"iPad4,7"]) ?return@"iPad Mini 3";
if([platform isEqualToString:@"iPad4,8"]) ?return@"iPad Mini 3";
if([platform isEqualToString:@"iPad4,9"]) ?return@"iPad Mini 3";
if([platform isEqualToString:@"iPad5,1"]) ?return@"iPad Mini 4";
if([platform isEqualToString:@"iPad5,2"]) ?return@"iPad Mini 4";
if([platform isEqualToString:@"iPad5,3"]) ?return@"iPad Air 2";
if([platform isEqualToString:@"iPad5,4"]) ?return@"iPad Air 2";
if([platform isEqualToString:@"iPad6,3"]) ?return@"iPad Pro 9.7";
if([platform isEqualToString:@"iPad6,4"]) ?return@"iPad Pro 9.7";
if([platform isEqualToString:@"iPad6,7"]) ?return@"iPad Pro 12.9";
if([platform isEqualToString:@"iPad6,8"]) ?return@"iPad Pro 12.9";
if([platform isEqualToString:@"i386"]) ?return@"iPhone Simulator";
if([platform isEqualToString:@"x86_64"]) ?return@"iPhone Simulator";
return platform;
}
下面是獲取iPhone手機(jī)是否劉海兒屏,方法和上面類似
/**
?判斷手機(jī)是否是異形屏幕
?iOS 10 以下 的系統(tǒng)肯定不是劉海兒屏闽晦,所以直接iOS10 及以下返回NO扳碍,iOS 11 和iOS 12 存在的手機(jī)型號很多,這里只要獲取手機(jī)是不是iPhone X 仙蛉、iPhone XS笋敞、iPhone XS Max、iPhone XR 這幾部手機(jī)就可以了荠瘪,剩下的直接返回NO?夯巷,這樣返回是YES就是曲面屏,(iOS 12 系統(tǒng)還沒有更新哀墓,不知道iPhone XS趁餐、iPhone XS Max、iPhone XR 的代碼篮绰,所以先寫了iPhone X的兩個機(jī)型)
?@return YES 是 異形屏幕
?*/
+ (BOOL)iphoneIsProfiledScreen {
? ? float systemValue =? [[[UIDevice currentDevice] systemVersion] floatValue];
? ? if ( systemValue >= 11?) {
? ? ? ? struct utsname systemInfo;
? ? ? ? uname(&systemInfo);
? ? ? ? NSString*platform = [NSString stringWithCString: systemInfo.machine encoding:NSASCIIStringEncoding];
? ? ? ? if([platform isEqualToString:@"iPhone10,3"] || [platform isEqualToString:@"iPhone10,6"]) {
? ? ? ? ? ? return YES;
? ? ? ? } else {
? ? ? ? ? ? return NO;
? ? ? ? }
? ? } else {
? ? ? ? return NO;
? ? }
}
獲取完是不是劉海屏后雷,剩下的自然就是適配劉海屏,劉海屏幕的出現(xiàn)打破以往的適配形式,導(dǎo)航有原來的64變成了88喷面,分欄控制器也發(fā)生了變化星瘾,所以我們當(dāng)我知道是否是劉海屏,就知道對應(yīng)的怎么適配
首先我們要創(chuàng)建三個最常用的宏定義惧辈,這兩個宏定義分別是自動適配導(dǎo)航的高度琳状,和分欄控制器的距離底部的高度
1、#define SafeAreaTopHeight? ? ([NSObject iphoneIsProfiledScreen] ?? ?88 : 64)
劉海屏幕返回88盒齿,反之返回64念逞,當(dāng)然這個高度可以更改,看APP需要
2边翁、#define SafeAreaBottomHeight ([NSObject iphoneIsProfiledScreen] ? 34 : 0)
原來距離底部距離為0 的按鈕或者其他控件翎承,如果是劉海屏都要向上移動34,為了劉海屏手機(jī)底部滑動條的區(qū)域留出 符匾,但是還是看APP需要
3 叨咖、#define SafeAreaStatusHeight ([NSObject iphoneIsProfiledScreen] ? 44 : 20)
這個是狀態(tài)欄的高度
這樣就可以用代碼適配所有手機(jī)型號了