首先获取设备型号 APP版本的操作
// 获取当前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"];
//手机别名: 用户定义的名称
NSString* userPhoneName = [[UIDevice currentDevice] name];
//设备名称
NSString* deviceName = [[UIDevice currentDevice] systemName];
//手机系统版本
NSString* phoneVersion = [[UIDevice currentDevice] systemVersion];
//手机型号
NSString* phoneModel = [[UIDevice currentDevice] model];
//地方型号 (国际化区域名称)
NSString* localPhoneModel = [[UIDevice currentDevice] localizedModel];
下面便是获取手机的型号
从下面开始的方法,都要引用下面这个库(iOS 12 系统还没有更新,不知道iPhone XS、iPhone XS Max、iPhone XR 的机型)
//需要导入头文件:#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手机是否刘海儿屏,方法和上面类似
/**
判断手机是否是异形屏幕
iOS 10 以下 的系统肯定不是刘海儿屏,所以直接iOS10 及以下返回NO,iOS 11 和iOS 12 存在的手机型号很多,这里只要获取手机是不是iPhone X 、iPhone XS、iPhone XS Max、iPhone XR 这几部手机就可以了,剩下的直接返回NO ,这样返回是YES就是曲面屏,(iOS 12 系统还没有更新,不知道iPhone XS、iPhone XS Max、iPhone XR 的代码,所以先写了iPhone X的两个机型)
@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;
}
}
获取完是不是刘海屏,剩下的自然就是适配刘海屏,刘海屏幕的出现打破以往的适配形式,导航有原来的64变成了88,分栏控制器也发生了变化,所以我们当我知道是否是刘海屏,就知道对应的怎么适配
首先我们要创建三个最常用的宏定义,这两个宏定义分别是自动适配导航的高度,和分栏控制器的距离底部的高度
1、#define SafeAreaTopHeight ([NSObject iphoneIsProfiledScreen] ? 88 : 64)
刘海屏幕返回88,反之返回64,当然这个高度可以更改,看APP需要
2、#define SafeAreaBottomHeight ([NSObject iphoneIsProfiledScreen] ? 34 : 0)
原来距离底部距离为0 的按钮或者其他控件,如果是刘海屏都要向上移动34,为了刘海屏手机底部滑动条的区域留出 ,但是还是看APP需要
3 、#define SafeAreaStatusHeight ([NSObject iphoneIsProfiledScreen] ? 44 : 20)
这个是状态栏的高度
这样就可以用代码适配所有手机型号了