2010-07-20 18 views
43

Sto cercando di creare un gioco per l'iphone utilizzando il motore cocos2d. Volevo sapere come faccio a capire se l'utente usa iphone 4 o iphone 3 perché volevo caricare grafica ad alta risoluzione per iphone4 e bassa risoluzione per iphone 3. So se uso @ 2x.png a la fine del nome del file immagine UIImage carica l'immagine ad alta risoluzione da sola se sto usando un iphone 4 ma per il gioco sto usando la classe CCSprite del motore cocos2d per caricare la grafica.Come distinguere tra iphone4 e iphone 3

Apprezzerei molto la risposta.

saluti, Ankur

risposta

123

Si potrebbe verificare la scala dello schermo.

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

Basta essere consapevoli che scala è disponibile anche su iPad in OS 3.2, non solo su iOS 4. –

+0

Giusto, ma la scala di un iPad non è 2. –

+3

In realtà, la scala dell'iPad è 2 quando è in modalità zoom 2x. –

3

Nonostante quello che dicono i documenti di Apple, di proprietà di scala del UIScreen non è solo disponibile in iOS4, è disponibile anche nella 3.2 su iPad. Ciò significa che probabilmente è un modo inaffidabile per verificare su quale dispositivo sei attivo.

Invece, è necessario verificare se contentScaleFactor è disponibile sulla finestra principale (o su qualsiasi UIView), quindi controllare il valore della scala.

+1

sfortunatamente, contentScaleFactor è nuovo anche in iOS 4, quindi non aiuta con la retrocompatibilità più della proprietà della scala. Mi chiedo se cambi immediatamente da 1 a 2 se l'utente fa clic sul pulsante "2x" sull'iPad? –

+1

Lo fa in 3.2, quindi penso che sarebbe in 4.2, non ho ancora controllato. –

3

La verifica della proprietà scale non è sufficiente, come su iPad 3.2 in modalità 2x, la proprietà scale esiste e restituisce 2.0, ma sappiamo che il dispositivo NON ha un display Retina.

Ho creato una categoria su UIScreen per fare ciò. Per una spiegazione più dettagliata, vedere la mia risposta allo Detect Retina Display. Ecco il codice: esempio

@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 

Usage:

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

Solo curioso ... perché hai? SÌ: NO alla fine? Non è necessario nel tuo codice, giusto? – donkim

+0

Hai ragione, non è necessario. Questo stile è una cattiva abitudine che ho imparato da alcuni esempi quando ho iniziato a studiare Objective-C. Fisso. – sickp

2

semplicemente aggiungendo i miei 2 centesimi:

vedo quello che state facendo qui, ma vincolante su un valore specifico come 2.0 è buono per il momento, ma cosa succederebbe se per esempio il prossimo iPad avesse una risoluzione come x1.5? Per me qualsiasi cosa che vada oltre 1.0 è una sorta di display superiore al normale, quindi caricherò la grafica ad alta risoluzione. Non importa molto quindi se questo è iPad, 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

So che l'argomento è un po 'vecchio, ma potrebbe aiutare alcune persone. Su Cocos2d puoi caricare grafica ad alta risoluzione per iphone4 e bassa risoluzione per iphone 3 usando il suffisso -hd sui tuoi file.

Basta attivare il display retina di simile prima:

// 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"); 

Per ulteriori informazioni leggere la documentazione qui: RetinaDisplay in cocos2d

0

scala è disponibile per iPad, ma è sempre possibile utilizzare if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) per verificare se è 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

Per la rilevazione retina display su tutti i dispositivi, tra cui il nuovo 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; 
} 

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

Problemi correlati