43 votes

Comment différencier iphone4 et iphone 3

Je suis en train de créer un jeu pour l'iphone à l'aide de cocos2d moteur. Je voulais savoir comment puis-je dire une différence si l'utilisateur est à l'aide d'un iphone 4 ou iphone 3 que j'ai voulu charger de salut-résolution graphique pour l'iphone4 et basse résolution pour l'iphone 3. Je sais que si j'utilise @2x.png à la fin du nom du fichier image UIImage charge le salut-résolution de l'image par elle-même si je suis en utilisant un iphone 4 mais pour le jeu je suis l'aide de cocos2d du moteur CCSprite de la classe à charger le graphique.

J'apprécierais vraiment une réponse.

En ce qui concerne, Ankur

123voto

Tom Irving Points 8113

Vous pouvez vérifier l'échelle de l'écran.

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

12voto

Willster Points 1458

Pour détecter l'affichage de la rétine sur tous les appareils, y compris le nouvel 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édit: Adriano Paladini http://developer.appcelerator.com/question/133826/detecting-new-ipad-3-dpi-and-retina

5voto

WrightsCS Points 32170
- (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";  
}  

3voto

Matt Rix Points 501

Malgré les documents d'Apple, la propriété scale d'UIScreen n'est pas seulement disponible dans iOS4, elle est également disponible en 3.2 sur iPad. Cela signifie que c'est probablement un moyen peu fiable de vérifier quel appareil vous utilisez.

Au lieu de cela, vous devriez vérifier si contentScaleFactor est disponible dans votre fenêtre principale (ou dans n’importe quel UIView), puis vérifier la valeur de l’échelle.

3voto

sickp Points 7522

La vérification de l' scale de la propriété n'est pas suffisant, comme sur l'iPad 3.2 en mode 2x, l' scale propriété existe et sera de retour 2.0, mais nous savons que l'appareil ne dispose PAS d'un écran Retina.

J'ai créé lors de la catégorie sur UIScreen pour ce faire. Pour une explication plus détaillée, voir ma réponse à Détecter Écran Retina. Voici le code:

@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

Exemple d'utilisation:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X