iPad 2检测
由于我没有iPad 2,因此在调用[[UIDevice currentDevice]模型]时需要知道它返回的内容。 我认为它只是返回“iPad”,但似乎我错了。
有人能让我知道吗?
谢谢
用照相机检查iPad。
BOOL isIPad2 = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]);
请注意,检测特定function通常更好,而不是基于模型/版本检测进行一揽子假设。 例如,如果你需要一个相机,然后明确地testing相机; 如果您需要根据可用RAM的数量调整UI质量,请testing物理RAM ; 等等。另外请注意, 我写的评论强调了使用模型检测的危险性。
不要使用model
属性来显示信息或诊断输出。 它不保证被保留,如果你依靠它,你不必要地切断新设备。
许多iPhone应用程序不能在iPad的兼容模式下使用,只是因为他们检查了model
属性,如果它不是iPhone / iPod,他们什么都不做。
为了得到精确的模型string,例如“iPad2,2”,你可以使用这样的东西。
#import "YourDeviceDetectionClass.h" #include <sys/utsname.h> @implementation YourDeviceDetectionClass +(NSString*)modelAsString { struct utsname platform; int rc = uname(&platform); if(rc == -1) { // Error... return nil; } else { // Convert C-string to NSString return [NSString stringWithCString:platform.machine encoding:NSUTF8StringEncoding]; } } @end
UIScreen + Retina.h #import
@interface UIScreen(Retina) // Returns YES if this is a Retina display. - (BOOL)isRetina; @end
UIScreen + Retina.m
#import "UIScreen+Retina.h" @implementation UIScreen(Retina) - (BOOL)isRetina { return [self respondsToSelector:@selector(displayLinkWithTarget:selector:)] && (self.scale == 2.0); } @end
用法
#import "UIScreen+Retina.h"
//http://stackoverflow.com/questions/3294100/how-to-differentiate-between-iphone4-and-iphone-3
if ([[UIScreen mainScreen] isRetina]) { // Retina display }
IPAD / IPHONE高/低RES
#import "UIScreen+Retina.h" if([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad){ //IPAD if ([[UIScreen mainScreen] isRetina]) { // IPAD 3 - Retina display bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPAD_HIGHRES; }else{ //iPAD 1/2 bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPAD_LOWRES; } }else{ //IPHONE if ([[UIScreen mainScreen] isRetina]) { // IPHONE 4/4s/5 - Retina display bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPHONE_HIGHRES; }else{ //IPHONE (3.x) bannersGetPromoServerRequest.size = kXML_API_IMAGESIZE_IPHONE_LOWRES; } }
我认为你可以testing它的规模
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { if ([[[UIScreen mainScreen] scale] == 2.0) { // retina display } }
如果您使用OpenGL,则可以查看GPU模型。 iPad 1有一个PowerVR SGX 535,iPad 2有一个PowerVR SGX 543。
const char * deviceStr = (const char *)glGetString(GL_RENDERER); if (!strcmp(deviceStr, "PowerVR SGX 535")) { // iPad 1 } else { // iPad 2 or later }
UIDevice类参考应该有所帮助。 对于更具体的解决scheme,试试这个问题 。
至于你的第二个问题,testing分辨率的最好方法是获取类似于iPad3,1的PPI数量的显示。 不幸的是,你可能不会。 testing任何应用程序的最佳方式是在实际的设备上。
这一行将打印设备版本:
iPad 1:平台:iPad1,1
iPad 2:平台:iPad2,1
iPad 3:平台:iPad3,3
Iphone 4S:平台:iPhone4,1
模拟器:平台:x86_64
size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *answer = (char*)malloc(size); sysctlbyname("hw.machine", answer, &size, NULL, 0); NSString *platform = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding]; free(answer); NSLog(@"Platform: %@", platform);
首先,我应该提到,我花了很多时间来弄清楚为什么iPad模拟器“说”它是iPhone。 对我来说,事实certificate,我只是把它切换到通用:
这是我认为是相当典型的检测代码的代码。 还有其他人也可能工作,但…
// lifted this from the ios 4 cookbook: - (BOOL) isiPad{ BOOL result = NO; NSString *classAsString = NSStringFromClass([UISplitViewController class]); if (classAsString == nil || [classAsString length] == 0){ return(NO); } UIDevice *device = [UIDevice currentDevice]; if ([device respondsToSelector: @selector(userInterfaceIdiom)] == NO){ return(NO); } NSLog(@"Device: %d", [[UIDevice currentDevice] userInterfaceIdiom]); NSLog(@"Device: %@", [[UIDevice currentDevice] model]); if ([device userInterfaceIdiom] != UIUserInterfaceIdiomPad){ return(NO); } // you can put some screen size tests here too if you'd like result = YES; return(result); }
您可以从以下网站获取所需的所有IPad2返回型号或iOS 设备型号 : IOS设备型号和平台
您也可以使用以下代码直接检索模型:
- (NSString *)deviceModel { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; } - (NSString *) platformString { NSString *platform = [self deviceModel]; if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone_2G"; else if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone_3G"; else if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone_3GS"; else if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone_4"; else if ([platform isEqualToString:@"iPhone3,3"]) return @"Verizon_iPhone_4"; else if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone_4S"; else if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone_5"; else if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone_5"; else if ([platform isEqualToString:@"iPod1,1"]) return @"iPod_Touch 1G"; else if ([platform isEqualToString:@"iPod2,1"]) return @"iPod_Touch 2G"; else if ([platform isEqualToString:@"iPod3,1"]) return @"iPod_Touch 3G"; else if ([platform isEqualToString:@"iPod4,1"]) return @"iPod_Touch 4G"; else if ([platform isEqualToString:@"iPad1,1"]) return @"iPad_1G"; else if ([platform isEqualToString:@"iPad2,1"]) return @"iPad_2(WiFi)"; else if ([platform isEqualToString:@"iPad2,2"]) return @"iPad_2(GSM)"; else if ([platform isEqualToString:@"iPad2,3"]) return @"iPad_2(CDMA)"; else if ([platform isEqualToString:@"iPad3,1"]) return @"iPad_3"; else if ([platform isEqualToString:@"iPad3,2"]) return @"iPad_3(GSM/CDMA)"; else if ([platform isEqualToString:@"iPad3,3"]) return @"iPad_3(GSM)"; else if ([platform isEqualToString:@"iPad3,4"]) return @"iPad_3(GSM)"; else if ([platform isEqualToString:@"iPad2,5"]) return @"iPad_mini_1G"; else if ([platform isEqualToString:@"i386"]) return @"Simulator"; else if ([platform isEqualToString:@"x86_64"]) return @"Simulator"; return platform; }
你在这里得到了很多答案,说明为什么你不应该这样做,并给你另外的代码,但你没有得到任何实际的答案你的问题。 如果你想确定你正在运行哪个设备(无论你想要什么目的…不要让其他开发者假装知道你要完成什么),你可以使用UIDeviceHardware
第三方类。 你可以在这里find它:
https://github.com/fahrulazmi/UIDeviceHardware
你只需要打电话:
NSString *platformString = [UIDeviceHardware platformString];
它会返回设备。 在你的情况,你会看到匹配platformString
的任何这些:
@"iPad 2 (WiFi)" @"iPad 2 (GSM)" @"iPad 2 (CDMA)"