2013-05-06 10 views
6

Ho utilizzato la riga successiva nelle mie costanti per differenziare i dispositivi e recuperare il numero del dispositivo. Qual è il modo appropriato per identificare iPhone 5 e mantenerlo in un formato a una riga?identifica iPhone 3, 4 e 5 nella stessa #def.

#define iPhoneType [[UIScreen mainScreen] scale]==2 || [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad ? @"4" : @"3" 

Grazie

Edit: Un sacco di buone risposte, ma il mio obiettivo è quello di mantenere in un formato una linea per tutti i dispositivi.

Modifica: Sulla base dei commenti, questa domanda necessita di alcuni chiarimenti. Ecco i requisiti:

  1. Una macro sola riga che restituisce @"3", @"4" o @"5" a seconda del dispositivo iOS.
  2. I dispositivi 4" (attualmente iPhone 5 e 5a generazione iPod touch) devono restituire @"5".
  3. Tutti gli iPads e tutti gli iPhone restante retina e tocchi di iPod dovrebbero tornare @"4".
  4. tutti gli iPhone non retina rimanenti e tocchi iPod dovrebbe restituire @"3".
+0

Perché non scrivere un metodo e utilizzarlo o chiamarlo in #define? –

+0

http://stackoverflow.com/questions/1108859/detect- the-specific-iphone-ipod-touch-model – Balu

+0

Qual è il tuo obiettivo qui ? La linea che hai postato significa "Se si tratta di un dispositivo di retina o di un iPad, restituire 4 altrimenti restituire 3". Cosa significa? Devi chiarire la tua domanda con maggiori dettagli su quale valore vuoi restituire per quali casi. – rmaddy

risposta

2

Assumendo i requisiti aggiornati sono corretti, il seguente dovrebbe funzionare:

#define iPhoneType (fabs((double)[UIScreen mainScreen].bounds.size.height - (double)568) < DBL_EPSILON) ? @"5" : ([UIScreen mainScreen].scale==2 || UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ? @"4" : @"3") 

Ciò restituirà @"5" per l'iPhone schermati 4" e iPod touch Ciò restituirà @"4" per tutti gli iPad e iPhone retina e iPod Touch. E restituirà @"3" per iPhone e iPod touch non retina

0

Il modo migliore per identificare i diversi dispositivi iOS programatically è la loro risoluzione dello schermo. ho fatto lo stesso nella mia applicazione si sta lavorando molto. si prega di fare riferimento il mio codice.

- (NSString *) getDeviceScreenWidth 
{ 
    CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
    CGFloat width = CGRectGetWidth(screenBounds); 
    NSNumber* number = [NSNumber numberWithFloat:width]; 
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
    [numberFormatter setNumberStyle:kCFNumberFormatterDecimalStyle]; 
    NSString* commaString = [numberFormatter stringForObjectValue:number]; 
    NSString *screenWidth = [NSString stringWithFormat:@"%@",commaString]; 
    NSLog(@"screen Width is: %@",screenWidth); 
    return screenWidth; 
} 

- (NSString *) getDeviceScreenHeight 
{ 
    CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
    CGFloat height = CGRectGetHeight(screenBounds); 
    NSNumber* number = [NSNumber numberWithFloat:height]; 
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
    [numberFormatter setNumberStyle:kCFNumberFormatterDecimalStyle]; 
    NSString* commaString = [numberFormatter stringForObjectValue:number]; 
    NSString *screenHeight = [NSString stringWithFormat:@"%@",commaString]; 
    NSLog(@"screen height is: %@",screenHeight); 
    return screenHeight; 
} 
+2

Questo è lontano dal "modo migliore" per identificare diversi dispositivi iOS. L'iPhone 5 e il quinto iPod touch hanno la stessa risoluzione. Ogni iPhone prima dell'iPhone 5 e ogni iPod touch prima del 5 ° gen hanno tutti la stessa risoluzione. Ogni iPad darà la stessa larghezza e altezza (dal momento che sono misurati in punti). – rmaddy

+1

Secondo la domanda, ho ragione, perché qui la domanda è identificare iphone 3,4,5 non ipod e ipad. Ma per maggiori informazioni il codice sopra è funzionante per iphone e ipad in ogni caso dal vecchio all'ultimo nuovo. –

+1

@Pranav ci sono modi molto più semplici per farlo, come il modo in cui "Dipen Panchasara' lo ha fatto, e anche il primo commento di' rmaddy' è corretto. Questo è probabilmente il motivo per cui hai ricevuto i 2 voti negativi. Inoltre non è dove vicino a 1 linea come l'utente ha chiesto in modo che non risponda alla domanda. – Popeye

2

Definire seguenti costanti in .pch di file del progetto

#define IS_IPHONE5   ([[UIScreen mainScreen] bounds].size.width >= 568 || [[UIScreen mainScreen] bounds].size.height >= 568)?YES:NO 
#define IS_IPHONE   (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)?YES:NO 
#define IS_IPAD    (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)?YES:NO 

#define DeviceType   ((IS_IPAD)[email protected]"IPAD":(IS_IPHONE5)[email protected]"IPHONE 5":@"IPHONE") 

ora Verifica tipo di dispositivo

NSLog(@"%@ %@",DeviceType,[DeviceType isEqualToString:@"IPAD"][email protected]"YES":@"NO"); 

Usa questa sequenza per identificare il tipo di dispositivo

if(IS_IPAD) 
    NSLog(@"IPAD"); 
else if(IS_IPHONE5) 
    NSLog(@"IPHONE 5"); 
else 
    NSLog(@"IPHONE"); 
+1

La macro IS_IPHONE5 non è corretta. Le dimensioni dello schermo su iPhone 5 sono 320x568. Dal momento che hai già verificato che l'altezza sia> = 568 non ha senso verificare anche se è> = 1136. Inoltre, quella macro tornerà vera su tutti gli iPad poiché le loro altezze sono 768. – rmaddy

+0

@rmaddy suo per display retina, e per errore ho bisogno di confrontare la larghezza per lo schermo del paesaggio. grazie per il pin che mi sta indicando! –

+1

Retina o meno, i limiti dello schermo sono riportati in punti, non in pixel. Quindi non otterrai mai 1136 come altezza. Otterrete 480 per dispositivi da 3,5 "e 568 per dispositivi da 4". E una macro chiamata 'IS_IPHONE5' non dovrebbe richiedere di chiamare prima qualche altra macro. – rmaddy

3

Secondo la vostra domanda che mi Supponendo che tu voglia identificare il dispositivo hardware, non l'iOS versione.

/* 
Erica Sadun, http://ericasadun.com 
iPhone Developer's Cookbook, 6.x Edition 
BSD License, Use at your own risk 
*/ 

#include <sys/sysctl.h> 

NSString* getSysInfoByName(char* typeSpecifier) { 
    size_t size; 
    sysctlbyname(typeSpecifier, NULL, &size, NULL, 0); 
    char *answer = malloc(size); 
    sysctlbyname(typeSpecifier, answer, &size, NULL, 0); 
    NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding]; 
    free(answer); 
    return results; 
} 

NSString* platform() { 
    return getSysInfoByName("hw.machine"); 
} 

Import quelle funzioni del PCH, allora siete liberi di chiamare questo uno di linea:

BOOL isIphone5 = [platform() hasPrefix:@"iPhone5"]; 

Funziona per qualsiasi dispositivo. Vedere UIDevice-Hardware.m per un elenco delle stringhe restituite.

0

Come esempio si possono trovare questo codice in cocos2d framework:

-(NSInteger) runningDevice 
{ 
    NSInteger ret=-1; 

#ifdef __CC_PLATFORM_IOS 

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 
     ret = (CC_CONTENT_SCALE_FACTOR() == 2) ? kCCDeviceiPadRetinaDisplay : kCCDeviceiPad; 
    } 
    else if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
    { 
     // From http://stackoverflow.com/a/12535566 
     BOOL isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136)); 

     if(CC_CONTENT_SCALE_FACTOR() == 2) { 
      ret = isiPhone5 ? kCCDeviceiPhone5RetinaDisplay : kCCDeviceiPhoneRetinaDisplay; 
     } else 
      ret = isiPhone5 ? kCCDeviceiPhone5 : kCCDeviceiPhone; 
    } 

#elif defined(__CC_PLATFORM_MAC) 

    // XXX: Add here support for Mac Retina Display 
    ret = kCCDeviceMac; 

#endif // __CC_PLATFORM_MAC 

    return ret; 
} 

Spero che questo codice consente modificare la macro.

+0

Non proprio una riga :) – Ren

Problemi correlati