iPhone 3.5英寸屏幕 – 4英寸屏幕:

我知道你可以select使用if语句与UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad iPad或iPhone。 但我想知道如果你可以做同样的iPhone 3.5英寸的屏幕iPhone 4英寸的屏幕。 我有一个游戏,最初是为iPhone 4英寸的屏幕devise的,但是自动布局已经被用于修复这两个设备之间的错误,我需要改变的一件事是,当

 if (ball.center.y > 600) { RandomPosition = arc4random() %248; RandomPosition = RandomPosition + 36; ball.center = CGPointMake(RandomPosition, -22); } 

因为它最初是在4英寸的屏幕上devise的,所以游戏被设置为将球重置到屏幕的顶部,当它大于600像素时,就在iPhone 4英寸屏幕的下方。 它仍然正常工作,3.5英寸的屏幕底部和位置的重置之间只是有点延迟。 有无论如何,我可以build立一个UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom(iphone4???)语句与UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom(iphone4???)build立一个新的ball.center.y> 300什么的?

你可以尝试下面的代码。 在Constant.h中添加此代码

 #define IS_IPAD (( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) ? YES : NO) #define IS_IPHONE_5 (([UIScreen mainScreen].scale == 2.f && [UIScreen mainScreen].bounds.size.height == 568)?YES:NO) #define IS_RETINA_DISPLAY_DEVICE (([UIScreen mainScreen].scale == 2.f)?YES:NO) 

现在检查设备大小,在视图中添加以下代码

 if (IS_IPAD) { //do stuff for iPad } else { if(IS_IPHONE_5) { //do stuff for 4 inch iPhone screen } else { //do stuff for 3.5 inch iPhone screen } } 

你可以通过起诉下面的声明检查3.5英寸和4英寸

 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { if ([[UIScreen mainScreen] bounds].size.height>480.0f) { NSLog(@"App is running on iPhone with screen 4 inch"); } else { NSLog(@"App is running on iPhone with screen 3.5 inch"); } } 

基于其他的答案,如果你打算做这个检查了很多,它可能是有意义的,为它创build一个macros:

 #define isLargerPhone() (([UIScreen mainScreen].bounds.size.height > 480) && [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 

把它放在一个MyMacros.h (或类似的)中,你可以将它导入到你的Prefix.pch文件中,然后当你需要执行检查时,你可以简单地执行:

 if ( isLargePhone()){ // do whatever... } 

您可以使用下面的方法来检查iPhone是iPhone 4即4英寸

 - (BOOL)hasFourInchDisplay { return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bounds.size.height == 568.0); } 

使用此方法可以知道iPhone5 / 4S / 4或其他设备的types和型号

 + (NSString *)yesButWhichDeviceIsIt { BOOL hasRetina = NO; if ([UIScreen instancesRespondToSelector:@selector(scale)]) { CGFloat scale = [[UIScreen mainScreen] scale]; if (scale > 1.0) { hasRetina = YES; } } if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { if (hasRetina) { return @"iPad retina"; } else { return @"iPad"; } } else { if (hasRetina) { if ([[UIScreen mainScreen] bounds].size.height == 568) { return @"iPhone5"; //4 inch 64 bit } else { return @"iPhone4s"; // 4 inch } } else { return @"iPhone"; //3.5 inch } } } 

我希望这个能帮上忙

好吧,我在这里它是在一个类别,抱歉作为答案,但它允许我更好的格式化…

第一个文件 – UIDevice + JEFkit.h

 #import <UIKit/UIKit.h> @interface UIDevice (JEFkit) #pragma mark device type.. +(NSString *)deviceType; +(BOOL)iPad; +(BOOL)iPadMini; +(BOOL)fourInchScreen; +(BOOL)retinaDisplay; +(Float32) pixelsPer10mm; #pragma mark orientation.. +(UIInterfaceOrientation)orient; +(BOOL)landscape; #pragma mark specific feature checkers.. +(NSString *)deviceName; +(BOOL)camera; +(NSString *)systemVersion; +(BOOL)doesSystemVersionMeetRequirement:(NSString *)minRequirement;// eg NSString *reqSysVer = @"4.0" +(BOOL)iOs7; @end 

和主要的,其中几个只是包装的东西,我很难记住,例如deviceIdiom的东西,反正它只是一个'佣工'类扩展.. UIDevice + JEFkit.m

 #import "UIDevice+JEFkit.h" #include <sys/types.h> #include <sys/sysctl.h> @implementation UIDevice (JEFkit) #pragma mark device type.. +(NSString *)deviceType{ NSString *result = [[UIDevice currentDevice] model]; return result; } +(BOOL)iPad{ BOOL result = NO; #if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200) if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { result = YES; } else { result = NO; } #endif return result; } +(BOOL)iPadMini{ if (![UIDevice iPad]) { return NO; } size_t size1; sysctlbyname("hw.machine", NULL, &size1, NULL, 0); char *machine1 = malloc(size1 + 1); sysctlbyname("hw.machine", machine1, &size1, NULL, 0); machine1[size1] = 0; if (strcmp(machine1, "iPad1,1") == 0 || strcmp(machine1, "iPad2,1") == 0 || strcmp(machine1, "iPad2,2") == 0 || strcmp(machine1, "iPad2,3") == 0 || strcmp(machine1, "iPad2,4") == 0 ) { /* iPad 1 or 2 */ // JLog(@"iPad 1 or 2"); free(machine1); return NO; } if ([[UIScreen mainScreen]respondsToSelector:@selector(scale)]) { if ([[UIScreen mainScreen] scale] < 2.0) { free(machine1); return YES; //all other non retina devices are eliminated } }else{ ///does not respond to @selector(scale) /// should not ever happen free(machine1); return NO; } //ok only retina ipads are left... if (strcmp(machine1, "iPad4,4") == 0 || strcmp(machine1, "iPad4,5") == 0 ) { /* 2nd gen minis w retina*/ free(machine1); return YES; } free(machine1); return NO; } +(BOOL)fourInchScreen{ if (![UIDevice iPad] && ([UIScreen mainScreen].bounds.size.height == 568 || [UIScreen mainScreen].bounds.size.width == 568)) return YES; else return NO; } +(BOOL)retinaDisplay{ BOOL result = NO; if ([[UIScreen mainScreen]respondsToSelector:@selector(scale)]){ if ([[UIScreen mainScreen] scale] == 2.0) result = YES; } return result; } +(Float32) pixelsPer10mm{ CGFloat dpi; if ([UIDevice iPadMini]) { dpi = (Float32)163.0; } else if ([UIDevice iPad]) { dpi = (Float32)132.0; }else {dpi = (Float32)163.0;} // JLog(@"pixels /10 mm %.3f", dpi/2.54); return (Float32)(dpi / (Float32)2.54); //return 64.173; } #pragma mark orientation.. +(UIInterfaceOrientation)orient{ return [[UIApplication sharedApplication] statusBarOrientation]; } +(BOOL)landscape{ if (UIInterfaceOrientationIsLandscape([UIDevice orient])) { return YES; } return NO; } #pragma mark specific feature checkers.. +(NSString *)deviceName{ return [[UIDevice currentDevice] name]; } +(BOOL)camera{ BOOL result = [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]; return result; } +(NSString *)systemVersion{ NSString *result = [[UIDevice currentDevice] systemVersion]; return result; } +(BOOL)doesSystemVersionMeetRequirement:(NSString *)minRequirement{ // eg NSString *reqSysVer = @"4.0"; NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; if ([currSysVer compare:minRequirement options:NSNumericSearch] != NSOrderedAscending) { return YES; }else{ return NO; } } +(BOOL)iOs7{ return (NSClassFromString(@"NSLayoutManager") != nil); } @end 

所以要使用这个类别我只是将其添加到项目(实际上是我的'jefkit'静态库的一部分,但如果我只是添加这个,身份证进入我的.pch文件并添加

 #import "UIDevice+JEFkit.h" 

我添加了一个检查最长的边缘,因为边界的值更改为设备方向。 我使用最长的边缘而不是设备的方向,因为有时方向可以被报告为“未知”。 我有一个UIDevice扩展:

 extension UIDevice { func isLargerPhone() -> Bool { let threePointFiveInchScreenHeight: CGFloat = 480 let dimensionToCheck = max(UIScreen.mainScreen().bounds.size.height, UIScreen.mainScreen().bounds.size.width) let isLargerPhone = dimensionToCheck > threePointFiveInchScreenHeight && userInterfaceIdiom == .Phone return isLargerPhone } func isSmallerPhone() -> Bool { return !isLargerPhone() && userInterfaceIdiom == .Phone } }