iOS How to detect iPhone X, iPhone 6 plus, iPhone 6, iPhone 5, iPhone 4 by macro?
如何用宏检测设备模型?我曾经用过类似的东西,但模拟器上的结果总是"iphone"5
1 2 3 4 5 6 7 | #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) #define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0) #define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0) #define IS_IPHONE_6PLUS (IS_IPHONE && [[UIScreen mainScreen] nativeScale] == 3.0f) #define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0) #define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0) |
迅捷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | import UIKit public enum DisplayType { case unknown case iphone4 case iphone5 case iphone6 case iphone6plus static let iphone7 = iphone6 static let iphone7plus = iphone6plus case iphoneX } public final class Display { class var width:CGFloat { return UIScreen.main.bounds.size.width } class var height:CGFloat { return UIScreen.main.bounds.size.height } class var maxLength:CGFloat { return max(width, height) } class var minLength:CGFloat { return min(width, height) } class var zoomed:Bool { return UIScreen.main.nativeScale >= UIScreen.main.scale } class var retina:Bool { return UIScreen.main.scale >= 2.0 } class var phone:Bool { return UIDevice.current.userInterfaceIdiom == .phone } class var pad:Bool { return UIDevice.current.userInterfaceIdiom == .pad } class var carplay:Bool { return UIDevice.current.userInterfaceIdiom == .carPlay } class var tv:Bool { return UIDevice.current.userInterfaceIdiom == .tv } class var typeIsLike:DisplayType { if phone && maxLength < 568 { return .iphone4 } else if phone && maxLength == 568 { return .iphone5 } else if phone && maxLength == 667 { return .iphone6 } else if phone && maxLength == 736 { return .iphone6plus } else if phone && maxLength == 812 { return .iphoneX } return .unknown } } |
行动起来看看https://gist.github.com/hbossli/bc93d924649de881ee2882457f14e346
注:如果iPhone6处于缩放模式,则用户界面是iPhone5的放大版本。这些功能不确定设备类型,但显示模式,因此在本例中,iPhone5是所需的结果。
Objtovi-C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #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_ZOOMED (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0) #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) #define IS_IPHONE_X (IS_IPHONE && SCREEN_MAX_LENGTH == 812.0) |
用法:http://pastie.org/9687735
注:如果iPhone6处于缩放模式,则用户界面是iPhone5的放大版本。这些功能不确定设备类型,但显示模式,因此在本例中,iPhone5是所需的结果。
Swift:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | struct ScreenSize { static let SCREEN_WIDTH = UIScreen.main.bounds.size.width static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT) static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT) } struct DeviceType { static let IS_IPHONE_4_OR_LESS = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0 static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0 static let IS_IPHONE_6 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0 static let IS_IPHONE_6P = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) // iPhone and iPod touch style UI #define IS_IPHONE_5_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f) #define IS_IPHONE_6_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0f) #define IS_IPHONE_6P_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0f) #define IS_IPHONE_4_AND_OLDER_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height < 568.0f) #define IS_IPHONE_5_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 568.0f) #define IS_IPHONE_6_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 667.0f) #define IS_IPHONE_6P_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 736.0f) #define IS_IPHONE_4_AND_OLDER_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) < 568.0f) #define IS_IPHONE_5 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_5_IOS8 : IS_IPHONE_5_IOS7 ) #define IS_IPHONE_6 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6_IOS8 : IS_IPHONE_6_IOS7 ) #define IS_IPHONE_6P ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6P_IOS8 : IS_IPHONE_6P_IOS7 ) #define IS_IPHONE_4_AND_OLDER ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_4_AND_OLDER_IOS8 : IS_IPHONE_4_AND_OLDER_IOS7 ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public extension UIDevice { var iPhone: Bool { return UIDevice().userInterfaceIdiom == .Phone } enum ScreenType: String { case iPhone4 case iPhone5 case iPhone6 case iPhone6Plus case Unknown } var screenType: ScreenType { guard iPhone else { return .Unknown} switch UIScreen.mainScreen().nativeBounds.height { case 960: return .iPhone4 case 1136: return .iPhone5 case 1334: return .iPhone6 case 1920: //fallthrough return .iPhone6Plus case 2208: return .iPhone6Plus default: return .Unknown } } } |
我使用一个类来提取实际的系统信息。只需确保所有设备类型都是最新的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | #import"Macros.h" @implementation Macros + (BOOL)IS_IPHONE_6_PLUS { return [[self deviceType] isEqualToString:@"iPhone 6 Plus"] || [[self deviceType] isEqualToString:@"iPhone 6S Plus"]; } + (BOOL)IS_IPHONE_6 { return [[self deviceType] isEqualToString:@"iPhone 6"] || [[self deviceType] isEqualToString:@"iPhone 6S"]; } + (BOOL)IS_SIMULATOR { return [[self deviceType] isEqualToString:@"32-bit Simulator"] || [[self deviceType] isEqualToString:@"64-bit Simulator"]; } + (BOOL)IS_IPHONE_5 { NSString *device = [self deviceType]; BOOL result = [device isEqualToString:@"iPhone 5(GSM)"] || [device isEqualToString:@"iPhone 5(GSM+CDMA)"] || [device isEqualToString:@"iPhone 5C(GSM)"] || [device isEqualToString:@"iPhone 5C(GSM+CDMA)"] || [device isEqualToString:@"iPhone 5S(GSM)"] || [device isEqualToString:@"iPhone 5S(GSM+CDMA)"]; return result; } /* @"i386" on 32-bit Simulator @"x86_64" on 64-bit Simulator @"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 Fifth Generation @"iPhone1,1" on iPhone @"iPhone1,2" on iPhone 3G @"iPhone2,1" on iPhone 3GS @"iPad1,1" on iPad @"iPad2,1" on iPad 2 @"iPad3,1" on 3rd Generation iPad @"iPad3,2": on iPad 3(GSM+CDMA) @"iPad3,3": on iPad 3(GSM) @"iPad3,4": on iPad 4(WiFi) @"iPad3,5": on iPad 4(GSM) @"iPad3,6": on iPad 4(GSM+CDMA) @"iPhone3,1" on iPhone 4 @"iPhone4,1" on iPhone 4S @"iPad3,4" on 4th Generation iPad @"iPad2,5" on iPad Mini @"iPhone5,1" on iPhone 5(GSM) @"iPhone5,2" on iPhone 5(GSM+CDMA) @"iPhone5,3 on iPhone 5c(GSM) @"iPhone5,4" on iPhone 5c(GSM+CDMA) @"iPhone6,1" on iPhone 5s(GSM) @"iPhone6,2" on iPhone 5s(GSM+CDMA) @"iPhone7,1" on iPhone 6 Plus @"iPhone7,2" on iPhone 6 @"iPhone8,1" on iPhone 6 @"iPhone8,2" on iPhone 6 Plus ...Yes Apple switched the order... */ + (NSString *)deviceType { struct utsname systemInfo; uname(&systemInfo); NSString *result = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; // https://www.theiphonewiki.com/wiki/Models NSDictionary *matches = @{ @"i386" : @"32-bit Simulator", @"x86_64" : @"64-bit Simulator", @"iPod1,1" : @"iPod Touch", @"iPod2,1" : @"iPod Touch Second Generation", @"iPod3,1" : @"iPod Touch Third Generation", @"iPod4,1" : @"iPod Touch Fourth Generation", @"iPod5,1" : @"iPod Touch Fifth Generation", @"iPad1,1" : @"iPad", @"iPad2,1" : @"iPad 2", @"iPad2,2" : @"iPad 2", @"iPad2,3" : @"iPad 2", @"iPad2,4" : @"iPad 2", @"iPad2,5" : @"iPad Mini", @"iPad2,6" : @"iPad Mini", @"iPad2,7" : @"iPad Mini", @"iPad3,1" : @"iPad 3", @"iPad3,2" : @"iPad 3(GSM+CDMA)", @"iPad3,3" : @"iPad 3(GSM)", @"iPad3,4" : @"iPad 4(WiFi)", @"iPad3,5" : @"iPad 4(GSM)", @"iPad3,6" : @"iPad 4(GSM+CDMA)", @"iPad4,1" : @"iPad Air", @"iPad4,2" : @"iPad Air", @"iPad4,3" : @"iPad Air", @"iPad4,4" : @"iPad Mini 2", @"iPad4,5" : @"iPad Mini 2", @"iPad4,6" : @"iPad Mini 2", @"iPad4,7" : @"iPad Mini 3", @"iPad4,8" : @"iPad Mini 3", @"iPad4,9" : @"iPad Mini 3", @"iPad5,1" : @"iPad Mini 4", @"iPad5,2" : @"iPad Mini 4", @"iPad5,3" : @"iPad Air 2", @"iPad5,4" : @"iPad Air 2", @"iPad6,3" : @"iPad Pro (9.7in)", @"iPad6,4" : @"iPad Pro (9.7in)", @"iPad6,7" : @"iPad Pro (12.9in)", @"iPad6,8" : @"iPad Pro (12.9in)", @"iPhone1,1" : @"iPhone", @"iPhone1,2" : @"iPhone 3G", @"iPhone2,1" : @"iPhone 3GS", @"iPhone3,1" : @"iPhone 4", @"iPhone3,3" : @"iPhone 4", @"iPhone4,1" : @"iPhone 4S", @"iPhone5,1" : @"iPhone 5(GSM)", @"iPhone5,2" : @"iPhone 5(GSM+CDMA)", @"iPhone5,3" : @"iPhone 5C(GSM)", @"iPhone5,4" : @"iPhone 5C(GSM+CDMA)", @"iPhone6,1" : @"iPhone 5S(GSM)", @"iPhone6,2" : @"iPhone 5S(GSM+CDMA)", @"iPhone7,1" : @"iPhone 6 Plus", @"iPhone7,2" : @"iPhone 6", @"iPhone8,1" : @"iPhone 6S", @"iPhone8,2" : @"iPhone 6S Plus", @"iPhone8,4" : @"iPhone SE", @"iPhone9,1" : @"iPhone 7", @"iPhone9,3" : @"iPhone 7", @"iPhone9,2" : @"iPhone 7 Plus", @"iPhone9,4" : @"iPhone 7 Plus", }; if (matches[result]) { return matches[result]; } else { return result; } } @end |
我可以确认当你设置一个启动屏幕时,错误消失了。
我保留了我的发射图像,并在发射屏幕上添加了主存储板,模拟器正确地识别了这些设备。
最好不要用设备类型绑定代码。这将导致不灵活、复杂的问题。苹果希望你考虑的是尺寸而不是设备。如果您需要为大于iPhone 5的设备(如图像或字体大小)设置特殊大小,我建议您创建一个带乘数的规范化类,该乘数根据iPhone 5屏幕宽度和当前设备大小之间的关系将基本大小增加一定百分比。
1 2 3 4 5 6 7 8 9 10 11 | let BaseWidth : CGFloat = 320 class Normalizer: NSObject { //scale value proportional to the screen width class func normalize(value:CGFloat,multiplier : CGFloat = 1,maxDelta:CGFloat = 1024) -> CGFloat{ let screenWidth = UIScreen.mainScreen().bounds.size.width let percent = (screenWidth - BaseWidth)/screenWidth let normalizedValue = value * (1 + percent) * multiplier return min(normalizedValue, value + maxDelta)//capped by a max value if needed } } |
因此,在代码中,您将执行如下操作:
1 | value = Normalizer.normalize(30) |
带swift 3+语法的uideivce扩展。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public extension UIDevice { var iPhone: Bool { return UIDevice().userInterfaceIdiom == .phone } enum ScreenType: String { case iPhone4 case iPhone5 case iPhone6 case iPhone6Plus case iPhoneX case Unknown } var screenType: ScreenType { guard iPhone else { return .Unknown} switch UIScreen.main.nativeBounds.height { case 960: return .iPhone4 case 1136: return .iPhone5 case 1334: return .iPhone6 case 2208, 1920: return .iPhone6Plus case 2436: return .iPhoneX default: return .Unknown } } } |
样品使用情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | switch UIDevice().screenType { case .iPhone4, .iPhone5: // Code for iPhone 4 & iPhone 5 break case .iPhone6: // Code for iPhone 6 & iPhone 7 break case .iPhone6Plus: // Code for iPhone 6 Plus & iPhone 7 Plus break case .iPhoneX: // Code for iPhone X break default: break } |
原始答案:https://stackoverflow.com/a/36479017/3659227
嗨,我更新到xcode10/swift 4.2和iPhone XS/XSmax/XR的新尺寸
有缺口iPhone的检测。
希望这能帮助别人。
1 2 3 4 5 | enum UIUserInterfaceIdiom : Int { case Unspecified case Phone case Pad |
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | struct ScreenSize { static let SCREEN_WIDTH = UIScreen.main.bounds.size.width static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT) static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT) } struct DeviceType { static let IS_IPHONE_4_OR_LESS = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0 static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0 static let IS_IPHONE_6_8 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0 static let IS_IPHONE_6_8P = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0 static let IS_IPHONE_X = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 812.0 static let IS_IPHONE_XR_SMAX = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 896.0 static let IS_IPAD = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0 static let IS_IPAD_PRO10 = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1112.0 static let IS_IPAD_PRO12 = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0 static let IS_IPHONE_NOTCH_DEVICE = (UIDevice.current.userInterfaceIdiom == .phone) && (ScreenSize.SCREEN_MAX_LENGTH == 896.0 || ScreenSize.SCREEN_MAX_LENGTH == 812.0) } struct Version{ static let SYS_VERSION_FLOAT = (UIDevice.current.systemVersion as NSString).floatValue static let iOS9 = (Version.SYS_VERSION_FLOAT >= 9.0 && Version.SYS_VERSION_FLOAT < 10.0) static let iOS10 = (Version.SYS_VERSION_FLOAT >= 10.0 && Version.SYS_VERSION_FLOAT < 11.0) static let iOS11 = (Version.SYS_VERSION_FLOAT >= 11.0 && Version.SYS_VERSION_FLOAT < 12.0) static let iOS12 = (Version.SYS_VERSION_FLOAT >= 12.0) } struct VersionAndNewer { static let iOS9 = (Version.SYS_VERSION_FLOAT >= 9.0) static let iOS10 = (Version.SYS_VERSION_FLOAT >= 10.0) static let iOS11 = (Version.SYS_VERSION_FLOAT >= 11.0) static let iOS12 = (Version.SYS_VERSION_FLOAT >= 12.0) } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | //Device Type enum enum DeviceType: Int { //Apple UnknownDevices case UnknownDevice = 0 //Simulator case Simulator //Apple Air pods case AppleAirPods //Apple TV case AppleTV2G case AppleTV3G case AppleTV4G case AppleTV4K //Apple Watch case AppleWatch case AppleWatchSeries1 case AppleWatchSeries2 case AppleWatchSeries3 //Apple Home Pods case AppleHomePods //Apple iPad case AppleIpad case AppleIpad2 case AppleIpad3 case AppleIpad4 case AppleIpadAir case AppleIpadAir2 case AppleIpadPro_12_9 case AppleIpadPro_9_7 case AppleIpad5 case AppleIpadPro_12_9_Gen_2 case AppleIpadPro_10_5 case AppleIpadMini case AppleIpadMini2 case AppleIpadMini3 case AppleIpadMini4 //Apple iPhone case AppleIphone case AppleIphone3G case AppleIphone3GS case AppleIphone4 case AppleIphone4S case AppleIphone5 case AppleIphone5C case AppleIphone5S case AppleIphone6 case AppleIphone6P case AppleIphone6S case AppleIphone6SP case AppleIphoneSE case AppleIphone7 case AppleIphone7P case AppleIphone8 case AppleIphone8P case AppleIphoneX //Apple iPod touch case AppleIpodTouch case AppleIpodTouch2G case AppleIpodTouch3G case AppleIpodTouch4G case AppleIpodTouch5G case AppleIpodTouch6G } // Method for device type func getDeviceType() -> DeviceType{ var systemInfo = utsname() uname(&systemInfo) let machineMirror = Mirror(reflecting: systemInfo.machine) let identifier = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } switch identifier { //Simulator case"i386","x86_64": return .Simulator //Apple Air Pods case"AirPods1,1": return .AppleAirPods //Apple TV case"AppleTV2,1": return .AppleTV2G case"AppleTV3,1","AppleTV3,2": return .AppleTV3G case"AppleTV5,3": return .AppleTV4G case"AppleTV6,2": return .AppleTV4K //Apple Watch case"Watch1,1","Watch1,2": return .AppleWatch case"Watch2,6","Watch2,7": return .AppleWatchSeries1 case"Watch2,3","Watch2,4": return .AppleWatchSeries2 case"Watch3,1","Watch3,2","Watch3,3","Watch3,4": return .AppleWatchSeries3 // Apple HomePods case"AudioAccessory1,1": return .AppleHomePods //Apple iPad case"iPad1,1": return .AppleIpad case"iPad2,1","iPad2,2","iPad2,3","iPad2,4": return .AppleIpad2 case"iPad3,1","iPad3,2","iPad3,3": return .AppleIpad3 case"iPad3,4","iPad3,5","iPad3,6": return .AppleIpad4 case"iPad4,1","iPad4,2","iPad4,3": return .AppleIpadAir case"iPad5,3","iPad5,4": return .AppleIpadAir2 case"iPad6,7","iPad6,8": return .AppleIpadPro_12_9 case"iPad6,3","iPad6,4": return .AppleIpadPro_9_7 case"iPad6,11","iPad6,12": return .AppleIpad5 case"iPad7,1","iPad7,2" : return .AppleIpadPro_12_9_Gen_2 case"iPad7,3","iPad7,4" : return .AppleIpadPro_10_5 case"iPad2,5","iPad2,6","iPad2,7": return .AppleIpadMini case"iPad4,4","iPad4,5","iPad4,6": return .AppleIpadMini2 case"iPad4,7","iPad4,8","iPad4,9": return .AppleIpadMini3 case"iPad5,1","iPad5,2": return .AppleIpadMini4 //Apple iPhone case"iPhone1,1": return .AppleIphone case"iPhone1,2": return .AppleIphone3G case"iPhone2,1": return .AppleIphone3GS case"iPhone3,1","iPhone3,2","iPhone3,3": return .AppleIphone4 case"iPhone4,1": return .AppleIphone4S case"iPhone5,1","iPhone5,2": return .AppleIphone5 case"iPhone5,3","iPhone5,4": return .AppleIphone5C case"iPhone6,1","iPhone6,2": return .AppleIphone5S case"iPhone7,2": return .AppleIphone6 case"iPhone7,1": return .AppleIphone6P case"iPhone8,1": return .AppleIphone6S case"iPhone8,2": return .AppleIphone6SP case"iPhone8,4": return .AppleIphoneSE case"iPhone9,1","iPhone9,3": return .AppleIphone7 case"iPhone9,2","iPhone9,4": return .AppleIphone7P case"iPhone10,1","iPhone10,4": return .AppleIphone8 case"iPhone10,2","iPhone10,5": return .AppleIphone8P case"iPhone10,3","iPhone10,6": return .AppleIphoneX //Apple iPod touch case"iPod1,1": return .AppleIpodTouch case"iPod2,1": return .AppleIpodTouch2G case"iPod3,1": return .AppleIpodTouch3G case"iPod4,1": return .AppleIpodTouch4G case"iPod5,1": return .AppleIpodTouch5G case"iPod7,1": return .AppleIpodTouch6G default: return .UnknownDevice } } |
我在从iOS 7项目迁移到iOS 8项目时遇到了这个问题,因为我没有在项目中添加启动屏幕场景。
在这种情况下,iPhone6和6+的屏幕大小与iPhone5相同。
从Apple文档中可以看到;您使用一个启动XIB或故事板文件来指示您的应用程序在iPhone6 Plus或iPhone6上运行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | import Foundation import UIKit public enum IADisplayType { // unknow device case unspecified // iPhone case unknowiPhone case iPhone3GS case iPhone4 static let iPhone4s = iPhone5 case iPhone5 static let iPhone5s = iPhone5 static let iPhoneSE = iPhone5 case iPhone6 case iPhone6Plus static let iPhone6s = iPhone6 static let iPhone6sPlus = iPhone6Plus static let iPhone7 = iPhone6 static let iPhone7Plus = iPhone6Plus static let iPhone8 = iPhone6 static let iPhone8Plus = iPhone6Plus case iPhoneX // iPad case unknowiPad case iPad79 static let iPad97 = iPad79 case iPad105 case iPad129 // Apple CarPlay case carPlay // Apple TV case tv } public final class IADisplayManager { // MARK: - public interface // singleton static var shared: IADisplayManager { get { return IADisplayManager() } } // get current device type public var currentType: IADisplayType { get { return calCurrentType() } } // device current Native Resolution public var nativeResolution: CGSize { get { return UIScreen.main.nativeBounds.size } } // device current Native Scale Factor public var nativeScaleFactor: CGFloat { get { return UIScreen.main.nativeScale } } // device current Interface Idiom public var interfaceIdiom: UIUserInterfaceIdiom { get { return UIDevice().userInterfaceIdiom } } fileprivate init() {} // MARK: - private interface fileprivate func calCurrentType() -> IADisplayType { typealias Type = IADisplayType // unknown device if interfaceIdiom == .unspecified { return Type.unspecified } // iPhone && iPod Touch else if interfaceIdiom == .phone { if nativeScaleFactor == 1.0 && nativeResolution == CGSize(width: 320, height: 480) { return Type.iPhone3GS } else if nativeScaleFactor == 2.0 && nativeResolution == CGSize(width: 640, height: 960) { return Type.iPhone4 } else if nativeScaleFactor == 2.0 && nativeResolution == CGSize(width: 640, height: 1136) { return Type.iPhone5 } else if nativeScaleFactor == 2.0 && nativeResolution == CGSize(width: 750, height: 1334) { return Type.iPhone6 } else if (nativeScaleFactor-2.608) < 0.001 && nativeResolution == CGSize(width: 1080, height: 1920) { return Type.iPhone6Plus } else if nativeScaleFactor == 3.0 && nativeResolution == CGSize(width: 1125, height: 2436) { return Type.iPhoneX } else { return Type.unknowiPhone } } // iPad else if interfaceIdiom == .pad { if nativeScaleFactor == 2.0 && nativeResolution == CGSize(width: 1536, height: 2048) { return Type.iPad79 } else if nativeScaleFactor == 2.0 && nativeResolution == CGSize(width: 2224, height: 1668) { return Type.iPad105 } else if nativeScaleFactor == 2.0 && nativeResolution == CGSize(width: 2048, height: 2732) { return Type.iPad129 } else { return Type.unknowiPad } } // Apple CarPlay else if interfaceIdiom == .carPlay { return Type.carPlay } // Apple TV else if interfaceIdiom == .tv { return Type.tv } // unknown device else { return Type.unspecified } } } |
另外,你还得检查变焦。
1 2 3 4 5 6 7 8 9 10 | struct DeviceType { static let IS_IPHONE = (UIDevice.current.userInterfaceIdiom == .phone) static let IS_IPHONE_4_OR_LESS = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0 static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0 static let IS_IPHONE_6_7 = (UIDevice.current.userInterfaceIdiom == .phone) && (ScreenSize.SCREEN_MAX_LENGTH == 667.0) && (UIScreen.main.nativeScale >= UIScreen.main.scale) private static let IS_STANDARD_IPHONE_6P_7P = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0 private static let IS_ZOOMED_IPHONE_6P_7P = (UIDevice.current.userInterfaceIdiom == .phone) && (ScreenSize.SCREEN_MAX_LENGTH == 667.0) && (UIScreen.main.nativeScale < UIScreen.main.scale) static let IS_IPHONE_6P_7P = IS_STANDARD_IPHONE_6P_7P || IS_ZOOMED_IPHONE_6P_7P } |