如何检测iPhone 5(宽屏设备)?

我刚刚升级到XCode 4.5 GM,发现你现在可以在故事板中的视图控制器上应用“4”视网膜大小。

现在,如果我想要创build一个在iPhone 4和iPhone 5上运行的应用程序,当然我必须构build每个窗口两次,但我也必须检测用户是否拥有3.5“或4”屏幕的iPhone,然后应用视图。

我该怎么做?

首先,你不应该重build所有的视图来适应新的屏幕,也不应该为不同的屏幕尺寸使用不同的视图。

使用iOS的自动resizefunction,以便您的视图可以调整,并适应任何屏幕大小。

这不是很难,读一些关于这个文件 。 它会为你节省很多时间。

iOS 6也提供了有关这方面的新function,但目前这仍然在NDA之下。
请务必阅读Apple开发者网站上的API更新日志 ,如果可以访问它的话。

编辑 :由于iOS 6现在出来,检查新的AutoLayoutfunction。

也就是说,如果你真的需要检测iPhone 5,你可以简单地依靠屏幕尺寸 。

[ [ UIScreen mainScreen ] bounds ].size.height 

iPhone 5的屏幕高度为568。
你可以想象一个macros,简化所有这一切:

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

使用epsilon fabs在这里可以防止精度错误,比较浮点数时,正如H2CO3的评论所指出的那样。

所以从现在开始,你可以在标准的if / else语句中使用它:

 if( IS_IPHONE_5 ) {} else {} 

编辑 – 更好的检测

正如一些人所说,这只能检测宽屏 ,而不是实际的iPhone 5。

iPod touch的下一个版本也可能有这样的屏幕,所以我们可能会使用另一组macros。

让我们重命名原始macrosIS_WIDESCREEN

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

我们添加模型检测macros:

 #define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] ) #define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] ) 

这样,我们可以确保我们有一个iPhone模型一个宽屏,我们可以重新定义IS_IPHONE_5macros:

 #define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN ) 

还要注意的是,正如@ LearnCocos2D所述,如果应用程序没有针对iPhone 5屏幕进行优化(缺lessDefault-568h@2x.png图像),则这些macros将不起作用,因为屏幕尺寸仍将是320×480一个案例。

我不认为这可能是一个问题,因为我不明白为什么我们想在未优化的应用程序中检测iPhone 5。

重要 – iOS 8的支持

在iOS 8上, UIScreen类的bounds属性现在反映了设备方向
所以显然,以前的代码不会在框中工作。

为了解决这个问题,你可以简单地使用新的nativeBounds属性,而不是bounds ,因为它不会随着方向而改变,因为它是基于纵向模式。
请注意, nativeBounds的尺寸以像素为单位,因此对于iPhone 5,高度将为1136而不是568。

如果您还定位iOS 7或更低版​​本,请务必使用function检测,因为在iOS 8之前调用nativeBounds会导致应用程序崩溃:

 if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) { /* Detect using nativeBounds - iOS 8 and greater */ } else { /* Detect using bounds - iOS 7 and lower */ } 

您可以按照以下方式调整以前的macros:

 #define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON ) #define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON ) #define IS_WIDESCREEN ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_WIDESCREEN_IOS8 : IS_WIDESCREEN_IOS7 ) 

显然,如果您需要检测iPhone 6或6 Plus,请使用相应的屏幕尺寸。

最后的笔记

意见和build议已被纳入这篇文章。
感谢大家。

testing和devise的SDK和操作系统的任何组合:

迅速

增加了iPadtypes。 iPad 2和iPad mini是非视网膜iPad。 虽然iPad Mini 2及以上版本,iPad 3,4,iPad Air,Air 2,Air 3和iPad Pro 9.7的逻辑分辨率为1024. iPad Pro的最大长度为1366. 参考

 import UIKit public enum DisplayType { case unknown case iphone4 case iphone5 case iphone6 case iphone6plus case iPadNonRetina case iPad case iPadProBig static let iphone7 = iphone6 static let iphone7plus = iphone6plus } 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 pad && !retina { return .iPadNonRetina } else if pad && retina && maxLength == 1024 { return .iPad } else if pad && maxLength == 1366 { return .iPadProBig } return .unknown } } 

在行动中看到它https://gist.github.com/hfossli/bc93d924649de881ee2882457f14e346

注意:如果例如iPhone 6处于放大模式,则UI是iPhone 5的放大版本。这些function不是确定设备types,但是iPhone 5的显示模式是本示例中期望的结果。

Objective-C的

 #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) 

用法: http : //pastie.org/9687735

注意:如果例如iPhone 6处于放大模式,则UI是iPhone 5的放大版本。这些function不是确定设备types,但是iPhone 5的显示模式是本示例中期望的结果。

真正简单的解决scheme

 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize result = [[UIScreen mainScreen] bounds].size; if(result.height == 480) { // iPhone Classic } if(result.height == 568) { // iPhone 5 } } 

我们现在需要考虑iPhone 6和6Plus的屏幕尺寸。 这是一个更新的答案

 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { //its iPhone. Find out which one? CGSize result = [[UIScreen mainScreen] bounds].size; if(result.height == 480) { // iPhone Classic } else if(result.height == 568) { // iPhone 5 } else if(result.height == 667) { // iPhone 6 } else if(result.height == 736) { // iPhone 6 Plus } } else { //its iPad } 

一些有用的信息

 iPhone 6 Plus 736x414 points 2208x1242 pixels 3x scale 1920x1080 physical pixels 401 physical ppi 5.5" iPhone 6 667x375 points 1334x750 pixels 2x scale 1334x750 physical pixels 326 physical ppi 4.7" iPhone 5 568x320 points 1136x640 pixels 2x scale 1136x640 physical pixels 326 physical ppi 4.0" iPhone 4 480x320 points 960x640 pixels 2x scale 960x640 physical pixels 326 physical ppi 3.5" iPhone 3GS 480x320 points 480x320 pixels 1x scale 480x320 physical pixels 163 physical ppi 3.5" 

我冒昧地把macros由Macmade放入C函数,并正确命名,因为它检测宽屏可用性 ,不一定是iPhone 5。

在项目不包含Default-568h@2x.png情况下,macros也不会检测iPhone 5上的运行。 如果没有新的默认图像,iPhone 5将报告一个普通的480×320屏幕尺寸(点数)。 所以检查不仅仅是为了宽屏的可用性,而是为了宽屏模式的启用

 BOOL isWidescreenEnabled() { return (BOOL)(fabs((double)[UIScreen mainScreen].bounds.size.height - (double)568) < DBL_EPSILON); } 

这里是我们的代码, 在iphone4,iphone5,ipad,iphone6,iphone6p的ios7 / ios8上通过testing,无论是在设备还是模拟器上:

 #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 ) 

我用hfossli的答案,并把它翻译成Swift

 let IS_IPAD = UIDevice.currentDevice().userInterfaceIdiom == .Pad let IS_IPHONE = UIDevice.currentDevice().userInterfaceIdiom == .Phone let IS_RETINA = UIScreen.mainScreen().scale >= 2.0 let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height let SCREEN_MAX_LENGTH = max(SCREEN_WIDTH, SCREEN_HEIGHT) let SCREEN_MIN_LENGTH = min(SCREEN_WIDTH, SCREEN_HEIGHT) let IS_IPHONE_4_OR_LESS = (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0) let IS_IPHONE_5 = (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0) let IS_IPHONE_6 = (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0) let IS_IPHONE_6P = (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0) 

这是我的cocos2d项目的macros。 应该是相同的其他应用程序。

 #define WIDTH_IPAD 1024 #define WIDTH_IPHONE_5 568 #define WIDTH_IPHONE_4 480 #define HEIGHT_IPAD 768 #define HEIGHT_IPHONE 320 #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) //width is height! #define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == WIDTH_IPHONE_5 ) #define IS_IPHONE_4 ( [ [ UIScreen mainScreen ] bounds ].size.height == WIDTH_IPHONE_4 ) #define cp_ph4(__X__, __Y__) ccp(cx_ph4(__X__), cy_ph4(__Y__)) #define cx_ph4(__X__) (IS_IPAD ? (__X__ * WIDTH_IPAD / WIDTH_IPHONE_4) : (IS_IPHONE_5 ? (__X__ * WIDTH_IPHONE_5 / WIDTH_IPHONE_4) : (__X__))) #define cy_ph4(__Y__) (IS_IPAD ? (__Y__ * HEIGHT_IPAD / HEIGHT_IPHONE) : (__Y__)) #define cp_pad(__X__, __Y__) ccp(cx_pad(__X__), cy_pad(__Y__)) #define cx_pad(__X__) (IS_IPAD ? (__X__) : (IS_IPHONE_5 ? (__X__ * WIDTH_IPHONE_5 / WIDTH_IPAD) : (__X__ * WIDTH_IPHONE_4 / WIDTH_IPAD))) #define cy_pad(__Y__) (IS_IPAD ? (__Y__) : (__Y__ * HEIGHT_IPHONE / HEIGHT_IPAD)) 
 if ((int)[[UIScreen mainScreen] bounds].size.height == 568) { // This is iPhone 5 screen } else { // This is iPhone 4 screen } 

在Swift中,我喜欢在UIScreen上做一个扩展,比如:

 extension UIScreen { var isPhone4: Bool { return self.nativeBounds.size.height == 960; } var isPhone5: Bool { return self.nativeBounds.size.height == 1136; } var isPhone6: Bool { return self.nativeBounds.size.height == 1334; } var isPhone6Plus: Bool { return self.nativeBounds.size.height == 2208; } } 

(注: nativeBounds以像素为单位)。

然后代码将如下所示:

 if UIScreen.mainScreen().isPhone4 { // do smth on the smallest screen } 

所以代码清楚地表明,这是对主屏幕的检查,而不是设备模型。

借助Samrat Mazumdar的回答,下面是估算设备屏幕尺寸的简短方法。 它适用于最新的设备,但可能在未来的设备上失败(所有猜测方法都可能)。 如果设备被镜像,它也会变得困惑(返回设备的屏幕大小,而不是镜像的屏幕大小)

 #define SCREEN_SIZE_IPHONE_CLASSIC 3.5 #define SCREEN_SIZE_IPHONE_TALL 4.0 #define SCREEN_SIZE_IPAD_CLASSIC 9.7 + (CGFloat)screenPhysicalSize { if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize result = [[UIScreen mainScreen] bounds].size; if (result.height < 500) return SCREEN_SIZE_IPHONE_CLASSIC; // iPhone 4S / 4th Gen iPod Touch or earlier else return SCREEN_SIZE_IPHONE_TALL; // iPhone 5 } else { return SCREEN_SIZE_IPAD_CLASSIC; // iPad } } 

我认为应该是好的,如果这个macros将在设备和模拟器中工作,下面是解决scheme。

 #define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON) #define IS_IPHONE (([[[UIDevice currentDevice] model] isEqualToString:@"iPhone"]) || ([[[UIDevice currentDevice] model] isEqualToString: @"iPhone Simulator"])) #define IS_IPOD ([[[UIDevice currentDevice]model] isEqualToString:@"iPod touch"]) #define IS_IPHONE_5 ((IS_IPHONE || IS_IPOD) && IS_WIDESCREEN) 

我发现答案不包括模拟器的特殊情况。

 #define IS_WIDESCREEN ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 ) #define IS_IPHONE ([[ [ UIDevice currentDevice ] model ] rangeOfString:@"iPhone"].location != NSNotFound) #define IS_IPAD ([[ [ UIDevice currentDevice ] model ] rangeOfString:@"iPad"].location != NSNotFound) #define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN ) 
 +(BOOL)isDeviceiPhone5 { BOOL iPhone5 = FALSE; CGRect screenBounds = [[UIScreen mainScreen] bounds]; if (screenBounds.size.height == 568) { // code for 4-inch screen iPhone5 = TRUE; } else { iPhone5 = FALSE; // code for 3.5-inch screen } return iPhone5; } 
 CGFloat height = [UIScreen mainScreen].bounds.size.height; NSLog(@"screen soze is %f",height); if (height>550) { // 4" screen-do some thing } else if (height<500) { // 3.5 " screen- do some thing } 

在这么多的层面上依靠大小是错误的。 我们如何要求系统?

 - (NSString *) getDeviceModel { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; } 

采取最佳的方式来检测硬件types,iPhone4或iPhone5? ,edzio27回答。

这样你可以检测到设备系列。

  #import <sys/utsname.h> NSString* deviceName() { struct utsname systemInformation; uname(&systemInformation); NSString *result = [NSString stringWithCString:systemInformation.machine encoding:NSUTF8StringEncoding]; return result; } #define isIPhone5 [deviceName() rangeOfString:@"iPhone5,"].location != NSNotFound #define isIPhone5S [deviceName() rangeOfString:@"iPhone6,"].location != NSNotFound 

如果项目是使用Xcode 6创build的,则使用下面提到的代码来检测设备。

 printf("\nDetected Resolution : %dx %d\n\n",(int)[[UIScreen mainScreen] nativeBounds].size.width,(int)[[UIScreen mainScreen] nativeBounds].size.height); if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){ if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) { if([[UIScreen mainScreen] nativeBounds].size.height == 960 || [[UIScreen mainScreen] nativeBounds].size.height == 480){ printf("Device Type : iPhone 4,4s "); }else if([[UIScreen mainScreen] nativeBounds].size.height == 1136){ printf("Device Type : iPhone 5,5S/iPod 5 "); }else if([[UIScreen mainScreen] nativeBounds].size.height == 1334){ printf("Device Type : iPhone 6 "); }else if([[UIScreen mainScreen] nativeBounds].size.height == 2208){ printf("Device Type : iPhone 6+ "); } } }else{ printf("Device Type : iPad"); } 

如果项目是在Xcode 5中创build的,并在Xcode 6中打开,那么使用下面提到的代码来检测这些设备(如果没有为iPhone 6,6+分配启动图像,则此代码有效)

 printf("\nDetected Resolution : %dx %d\n\n",(int)[[UIScreen mainScreen] nativeBounds].size.width,(int)[[UIScreen mainScreen] nativeBounds].size.height); if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){ if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) { if([[UIScreen mainScreen] nativeBounds].size.height == 960 || [[UIScreen mainScreen] nativeBounds].size.height == 480){ printf("Device Type : iPhone 4,4s"); appType=1; }else if([[UIScreen mainScreen] nativeBounds].size.height == 1136 || [[UIScreen mainScreen] nativeBounds].size.height == 1704){ printf("Device Type : iPhone 5,5S,6,6S/iPod 5 "); appType=3; } } }else{ printf("Device Type : iPad"); appType=2; } 

如果您还在使用Xcode 5,请使用以下代码检测设备(iPhone 6和6+不会被检测到)

 printf("\nDetected Resolution : %dx %d\n\n",(int)[[UIScreen mainScreen] bounds].size.width,(int)[[UIScreen mainScreen] bounds].size.height); if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){ if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) { CGSize result = [[UIScreen mainScreen] bounds].size; CGFloat scale = [UIScreen mainScreen].scale; result = CGSizeMake(result.width * scale, result.height * scale); if(result.height == 960 || result.height == 480){ printf("Device Type : iPhone 4,4S "); }else if(result.height == 1136){ printf("Device Type : iPhone 5s/iPod 5"); } } }else{ printf("Device Type : iPad"); } 
  1. 添加一个“新的Swift文件” – > AppDelegateEx.swift

  2. 添加一个扩展到AppDelegate

     import UIKit extension AppDelegate { class func isIPhone5 () -> Bool{ return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 568.0 } class func isIPhone6 () -> Bool { return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 667.0 } class func isIPhone6Plus () -> Bool { return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 736.0 } } 
  3. 用法:

      if AppDelegate.isIPhone5() { collectionViewTopConstraint.constant = 2 }else if AppDelegate.isIPhone6() { collectionViewTopConstraint.constant = 20 } 

这已经被回答了一百次,但是这个解决scheme对我来说是最好的。 这是一个简单的帮助函数,不需要扩展系统类。

Swift 3助手:

 func phoneSizeInInches(defaultValue: Float = 4.7) -> Float { switch (UIScreen.main.nativeBounds.size.height) { case 960, 480: return 3.5 case 1136: return 4 case 1334: return 4.7 case 2208: return 5.5 default: return defaultValue } } 

这是因为很容易记住手机的英寸尺寸,例如“5.5英寸”或“4.7英寸”的设备,但很难记住确切的像素尺寸。

 if phoneSizeInInches() == 4 { //do something with only 4 inch iPhones } 

这也让你有机会做这样的事情:

 if phoneSizeInInches() < 5.5 { //do something all iPhones smaller than the plus } 

如果Apple发布新的设备大小,并且尚未更新应用程序,“defaultValue”可确保您的代码始终回退到安全大小。

 if phoneSizeInInches(defaultValue: 4.7) == 4 { //if a new iPhone size is introduced, your code will default to behaving like a 4.7 inch iPhone } 

请注意,这是特定的手机应用程序,将需要一些普遍的变化。

在Swift 3中,你可以使用我的简单类KRDeviceType。

https://github.com/ulian-onua/KRDeviceType

它很好的logging和支持运算符==,> =,<=。

例如,要检测设备是否具有iPhone 6 / 6s / 7的界限,则可以使用下一个比较:

 if KRDeviceType() == .iPhone6 { // Perform appropiate operations } 

要检测设备是否具有iPhone 5 / 5S / SE或更早版本(iPhone 4s)的界限,可以使用下一个比较:

 if KRDeviceType() <= .iPhone5 { //iPhone 5/5s/SE of iPhone 4s // Perform appropiate operations (for example, set up constraints for those old devices) } 

使用下面的代码:

 CGFloat screenScale = [[UIScreen mainScreen] scale]; CGRect screenBounds = [[UIScreen mainScreen] bounds]; CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale); if (screenSize.height==1136.000000) { // Here iPhone 5 View // Eg: Nextview~iPhone5.Xib } else { // Previous Phones // Eg : Nextview.xib } 

这是设备的正确testing,不依赖于方向

 - (BOOL)isIPhone5 { CGSize size = [[UIScreen mainScreen] bounds].size; if (MIN(size.width,size.height) == 320 && MAX(size.width,size.height == 568)) { return YES; } return NO; } 

用于检测所有版本的iPhone和iPad设备。

 #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_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0) #define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)