1、前言node
今天作一个功能,须要动态的得到启动页,而后根据不一样设备去使用不用的启动页图片。ios
2、正文 测试
常规来讲,咱们直接判断是何种设备,而后经过name去得到图片选择性加载便可。可是实际上遇到的两个问题。this
第一:如何判断各类设备。google
第二:怎么去拿到启动页图片。spa
先看第一个问题,怎么去判断各类设备。原来习惯性的是直接判断设备高度。闲着没事就经过code
[UIScreen mainScreen].bounds.size.height
这个方法去得到各类设备的高度,以下:orm
//iPhone4s 480 //iPhone 5 568 //iPhone 5s 568 //iPhone 6 667 //iPhone 6p 736 //iPhone 6s 667 //iPhone 6sp 736
所以作了一个判断方法一:图片
- (NSString *)getCurrentDeviceVersion { CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height; if (screenHeight==480) { // return nil; return @"iPhone4/iPhone4s"; }else if (screenHeight==568) { return @"iPhone5/iPhone5s/iPhone5c"; }else if (screenHeight==667) { return @"iPhone6/iPhone6s"; }else if (screenHeight==736) { return @"iPhone6 plus/iPhone6s plus"; }else { return @"another"; } }
其实这是一个很low的方法,只是根据高度去判断,不过这样也能够去判断。get
下面来看看方法二:
首先,咱们须要在使用的类里面导入:
#import <sys/utsname.h> - (NSString *)getDeviceVersion { struct utsname systemInfo; uname(&systemInfo); NSString *deviceName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if ([deviceName isEqualToString:@"iPhone3,1"] || [deviceName isEqualToString:@"iPhone3,3"]|| [deviceName isEqualToString:@"iPhone4,1"]) { //判断是不是iPhone4,iPhone4s return @"iPhone4/iPhone4s"; }else if ([deviceName isEqualToString:@"iPhone5,1"]|| [deviceName isEqualToString:@"iPhone5,2"]||[deviceName isEqualToString:@"iPhone5,3"] || [deviceName isEqualToString:@"iPhone5,4"] || [deviceName isEqualToString:@"iPhone6,1"] || [deviceName isEqualToString:@"iPhone6,2"]) { return @"iPhone5/iPhone5s/iPhone5c"; }else if ([deviceName isEqualToString:@"iPhone7,1"] || [deviceName isEqualToString:@"iPhone8,2"]) { return @"iPhone6 plus/iPhone6s plus"; }else if ([deviceName isEqualToString:@"iPhone7,2"] || [deviceName isEqualToString:@"iPhone8,1"]) { return @"iPhone6/iPhone6s"; }else { //真机上边不会走到 return @"another"; } }
方法二主要用到了一个类utsname.h。打开以后,咱们能够发现他就是一个结构体:
struct utsname { char sysname[_SYS_NAMELEN]; /* [XSI] Name of OS */ char nodename[_SYS_NAMELEN]; /* [XSI] Name of this network node */ char release[_SYS_NAMELEN]; /* [XSI] Release level */ char version[_SYS_NAMELEN]; /* [XSI] Version level */ char machine[_SYS_NAMELEN]; /* [XSI] Hardware type */ };
先来看看怎么去取到
struct utsname systemInfo; uname(&systemInfo); NSString *deviceName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
当输出deviceName的时候,你就会发现不一样的设备将会输出不一样的内容,可是当咱们使用模拟器的时候,会输出:
x86_64
其实这个是在64-bit Simulator下输出的。若是咱们使用的是32-bit Simulator,那么输出的结果就是
i386
而后我使用iPhone5s进行测试,输出结果是:
iPhone6,2
当时比较疑惑,这是什么状况呢?而后就google了一下。原来这个是设备的类型。并且不一样的设备类型也不同。而后就在这里发现了下面的内容:(其实这个结果就是设备类型)
//模拟器 @"i386" on 32-bit Simulator @"x86_64" on 64-bit Simulator //iPod--可能不全面 @"iPod1,1" on iPod Touch @"iPod2,1" on iPod Touch Second Generation @"iPod3,1" on iPod Touch Third Generation @"iPod4,1" on iPod Touch Fourth Generation @"iPod5,1" on iPod Touch 5th Generation @"iPod7,1" on iPod Touch 6th Generation //iPhone --全面了 @"iPhone1,1" on iPhone @"iPhone1,2" on iPhone 3G @"iPhone2,1" on iPhone 3GS @"iPhone3,1" on iPhone 4 (GSM) @"iPhone3,2" on iPhone 4 @"iPhone3,3" on iPhone 4 (CDMA/Verizon/Sprint) @"iPhone4,1" on iPhone 4S @"iPhone5,1" on iPhone 5 (model A1428, AT&T/Canada) @"iPhone5,2" on iPhone 5 (model A1429, everything else) @"iPhone5,3" on iPhone 5c (model A1456, A1532 | GSM) @"iPhone5,4" on iPhone 5c (model A1507, A1516, A1526 (China), A1529 | Global) @"iPhone6,1" on iPhone 5s (model A1433, A1533 | GSM) @"iPhone6,2" on iPhone 5s (model A1457, A1518, A1528 (China), A1530 | Global) @"iPhone7,1" on iPhone 6 Plus @"iPhone7,2" on iPhone 6 @"iPhone8,1" on iPhone 6S @"iPhone8,2" on iPhone 6S Plus //iPad --不全面 @"iPad1,1" on iPad @"iPad2,1" on iPad 2 @"iPad3,1" on 3rd Generation iPad @"iPad3,4" on 4th Generation iPad @"iPad2,5" on iPad Mini @"iPad4,1" on 5th Generation iPad (iPad Air) - Wifi @"iPad4,2" on 5th Generation iPad (iPad Air) - Cellular @"iPad4,4" on 2nd Generation iPad Mini - Wifi @"iPad4,5" on 2nd Generation iPad Mini - Cellular @"iPad4,7" on 3rd Generation iPad Mini - Wifi (model A1599)
这里几乎包括了全部的iOS移动设备。
而后就根据这个去判断了一下
- (NSString *)getDeviceModel { struct utsname systemInfo; uname(&systemInfo); NSString *deviceName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if ([deviceName isEqualToString:@"iPhone3,1"] || [deviceName isEqualToString:@"iPhone3,3"]|| [deviceName isEqualToString:@"iPhone4,1"]) { //判断是不是iPhone4,iPhone4s return @"iPhone4/iPhone4s"; }else if ([deviceName isEqualToString:@"iPhone5,1"]|| [deviceName isEqualToString:@"iPhone5,2"]||[deviceName isEqualToString:@"iPhone5,3"] || [deviceName isEqualToString:@"iPhone5,4"] || [deviceName isEqualToString:@"iPhone6,1"] || [deviceName isEqualToString:@"iPhone6,2"]) { return @"iPhone5/iPhone5s/iPhone5c"; }else if ([deviceName isEqualToString:@"iPhone7,1"] || [deviceName isEqualToString:@"iPhone8,2"]) { return @"iPhone6 plus/iPhone6s plus"; }else if ([deviceName isEqualToString:@"iPhone7,2"] || [deviceName isEqualToString:@"iPhone8,1"]) { return @"iPhone6/iPhone6s"; }else { //真机上边不会走到 return @"another"; } }
这样就获得了不一样版本的设备。有兴趣的话还能够点这里(可能须要越狱)
这样,第一个问题就结局了。第二个问题是如何得到当前project的启动页面。(不要妄想去经过名字拿,试了,拿不到。)
后来google了一下:获得以下
//iPhone4/4s:[UIImage imageNamed: @"LaunchImage-700"]; // //iPhone5/5s/5c: [UIImage imageNamed: @"LaunchImage-700-568h"]; // //iPhone6: [UIImage imageNamed: @"LaunchImage-800-667h"]; // //iPhone6 plus 竖屏:[UIImage imageNamed: @"LaunchImage-800-Portrait-736h"]; // //iPhone6 plus 横屏:[UIImage imageNamed: @"LaunchImage-800-Portrait-736h"];
意思就是当你是iPhone4/4s的时候,就经过
[UIImage imageNamed: @"LaunchImage-700"];
来拿到启动页面。其余的同样。
这样就拿到了启动页面。
综合起来解决前言问题的方法就是:
//方法一<br>- (UIImage *)getLaunchImage { CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height; if (screenHeight==480) { // return nil; return [UIImage imageNamed: @"LaunchImage-700"]; }else if (screenHeight==568) { return [UIImage imageNamed: @"LaunchImage-700-568h"]; }else if (screenHeight==667) { return [UIImage imageNamed: @"LaunchImage-800-667h"]; }else if (screenHeight==736) { return [UIImage imageNamed: @"LaunchImage-800-Portrait-736h"]; }else { return [UIImage imageNamed:@"placeH"]; } } /** * 经过系统信息获得版本 *方法二 * @return 指定的LaunchImage */ - (UIImage *)getLaunchImageByiPhoneType { struct utsname systemInfo; uname(&systemInfo); NSString *deviceName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if ([deviceName isEqualToString:@"iPhone3,1"] || [deviceName isEqualToString:@"3,2"] ||[deviceName isEqualToString:@"iPhone3,3"]|| [deviceName isEqualToString:@"iPhone4,1"]) { //判断是不是iPhone4,iPhone4s return [UIImage imageNamed:@"LaunchImage-700"]; }else if ([deviceName isEqualToString:@"iPhone5,1"]|| [deviceName isEqualToString:@"iPhone5,2"]||[deviceName isEqualToString:@"iPhone5,3"] || [deviceName isEqualToString:@"iPhone5,4"] || [deviceName isEqualToString:@"iPhone6,1"] || [deviceName isEqualToString:@"iPhone6,2"]) { return [UIImage imageNamed: @"LaunchImage-700-568h"]; }else if ([deviceName isEqualToString:@"iPhone7,1"] || [deviceName isEqualToString:@"iPhone8,2"]) { return [UIImage imageNamed: @"LaunchImage-800-Portrait-736h"]; }else if ([deviceName isEqualToString:@"iPhone7,2"] || [deviceName isEqualToString:@"iPhone8,1"]) { return [UIImage imageNamed: @"LaunchImage-800-667h"]; }else { //真机上边不会走到 return [UIImage imageNamed:@"placeH"]; //这里我用了一张默认图片 } }