2010-07-20 10 views
43

Estoy tratando de crear 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.Cómo diferenciar entre iphone4 y iphone 3

Realmente agradecería la respuesta.

Saludos, Ankur

Respuesta

123

se puede comprobar la escala de la pantalla.

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

Sólo ten en cuenta que la escala está también disponible en el iPad en OS 3.2, no solo en iOS 4. –

+0

Correcto, pero la escala de un iPad no es 2. –

+3

En realidad, la escala del iPad es 2 cuando está en modo zoom 2x. –

3

A pesar de lo que dicen los documentos de Apple, la propiedad de la escala UIScreen no es sólo disponible en iOS4, que 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 verifique el valor de la escala.

+1

desafortunadamente, contentScaleFactor también es nuevo en iOS 4, por lo que no ayuda con la compatibilidad con versiones anteriores más que con la propiedad de escala. Me pregunto si cambia de 1 a 2 sobre la marcha si el usuario hace clic en el botón "2x" en el iPad. –

+1

Lo hace en 3.2, así que supongo que también lo haría en 4.2, pero aún no lo he comprobado. –

3

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

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

@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 

Uso:

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

Simplemente curioso ... ¿por qué tienes '? SÍ: NO' al final? No es necesario en tu código, ¿verdad? – donkim

+0

Tienes razón, es innecesario. Este estilo es un mal hábito que aprendí de algunos ejemplos cuando estaba aprendiendo Objective-C por primera vez. Fijo. – sickp

2

sólo añadir mis 2 centavos:

veo lo que está haciendo aquí, pero la unión a un valor específico como 2.0 es buena por el momento, pero ¿y si, por ejemplo, el próximo iPad tiene un bache 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, entonces si ese es el iPad, el iPhone ....

5
- (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"; 
} 
2

Sé que el tema es un poco viejo, 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.

sólo hay que activar la pantalla de la retina como esto 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 in cocos2d

0

escala está disponible para iPad, sin embargo siempre se puede utilizar si (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) para comprobar si es iPad o iPhone/iTouch

2

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; 

    } 
} 
12

Para la detección de pantalla de la retina en todos los dispositivos, incluyendo 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; 
} 

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

Cuestiones relacionadas