ios ccsprite

ios - Cómo diferenciar entre iphone4 y iphone 3



ccsprite (9)

importar "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; } }

Estoy tratando de construir un juego para el iPhone usando el motor Cocos2D. Quería saber cómo puedo diferenciar si el usuario está usando iphone 4 o iphone 3 porque quería cargar gráficos de alta resolución para el iphone4 y baja resolución para el iphone 3. Sé si uso @ 2x.png en el final del nombre del archivo de imagen UIImage carga la imagen de alta resolución por sí mismo si estoy usando un iphone 4, pero para el juego estoy usando la clase CCSprite del motor cocos2d para cargar los gráficos.

Realmente apreciaría la respuesta.

Saludos, Ankur


A pesar de lo que dicen los documentos de Apple, la propiedad de escala de UIScreen no solo está disponible en iOS4, también está disponible en 3.2 en el iPad. Esto significa que probablemente sea una forma poco confiable de verificar en qué dispositivo estás.

En su lugar, debe verificar si contentScaleFactor está disponible en su ventana principal (o en cualquier UIView), y luego verificar el valor de la escala.


Comprobar la propiedad de la scale no es suficiente, como en iPad 3.2 en modo 2x, la propiedad de la scale existe y devolverá 2.0, pero sabemos que ese dispositivo NO tiene una pantalla Retina.

UIScreen en la categoría en UIScreen para hacer esto. Para una explicación más detallada, vea mi respuesta a Detectar Retina Display . Aquí está el código:

@interface UIScreen(ZBScreenRetinaAdditions) // Returns YES if this is a Retina display. - (BOOL)zb_isRetina; @end @implementation UIScreen(ZBScreenRetinaAdditions) - (BOOL)zb_isRetina { return [self respondsToSelector:@selector(displayLinkWithTarget:selector:)] && (self.scale == 2.0); } @end

Ejemplo de uso:

if ([UIScreen mainScreen] zb_isRetina) { // Retina display }


Para detectar la visualización de la retina en todos los dispositivos, incluido el nuevo iPad

+(BOOL)isRetinaDisplay { // since we call this alot, cache it static CGFloat scale = 0.0; if (scale == 0.0) { // NOTE: In order to detect the Retina display reliably on all iOS devices, // you need to check if the device is running iOS4+ and if the // [UIScreen mainScreen].scale property is equal to 2.0. // You CANNOT assume a device is running iOS4+ if the scale property exists, // as the iPad 3.2 also contains this property. // On an iPad running iOS3.2, scale will return 1.0 in 1x mode, and 2.0 // in 2x mode -- even though we know that device does not contain a Retina display. // Apple changed this behavior in iOS4.2 for the iPad: it returns 1.0 in both // 1x and 2x modes. You can test this yourself in the simulator. // I test for the -displayLinkWithTarget:selector: method on the main screen // which exists in iOS4.x but not iOS3.2, and then check the screen''s scale: if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0)) { scale = 2.0; return YES; } else { scale = 1.0; return NO; } } return scale > 1.0; }

Gracias a: Adriano Paladini http://developer.appcelerator.com/question/133826/detecting-new-ipad-3-dpi-and-retina


Sé que el tema es un poco viejo ahora, pero podría ayudar a algunas personas. En Cocos2d puede cargar gráficos de alta resolución para el iphone4 y de baja resolución para el iphone 3 usando el sufijo -hd en sus archivos.

Solo tiene que habilitar la pantalla Retina como esta antes:

// Enables High Res mode (Retina Display) on iPhone 4 and maintains low res on all other devices if( ! [director enableRetinaDisplay:YES] ) CCLOG(@"Retina Display Not supported");

Para obtener más información, lea la documentación aquí: RetinaDisplay en cocos2d


Usted puede verificar la escala de la pantalla.

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2){ //iPhone 4 }


la escala está disponible para iPad, sin embargo, siempre puedes usar if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiomPad) para verificar si es iPad o iPhone / iTouch


simplemente agregando mis 2 centavos:

Veo lo que está haciendo aquí, pero vincular esto a un valor específico como 2.0 es bueno por el momento, pero ¿qué ocurre si, por ejemplo, el próximo iPad obtiene un aumento de resolución como x1.5? Para mí, cualquier cosa que supere 1.0 es algo más que lo normal, así que cargaré gráficos de alta resolución. No importa mucho si eso es iPad, iPhone ...


- (NSString *) platform { size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *machine = malloc(size); sysctlbyname("hw.machine", machine, &size, NULL, 0); NSString *platform = [NSString stringWithCString:machine]; free(machine); return platform; } - (NSString *) platformString { NSString *platform = [self platform]; if ([platform isEqualToString:@"iPhone1,1"]) return @"Original iPhone"; if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3G[S]"; if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; return @"Unknown"; }