2012-10-24 16 views
7

Sto configurando un'applicazione in cui voglio apportare una serie di modifiche al layout della vista in base al tipo di iPhone in uso. Nello specifico voglio sapere se la risoluzione dello schermo verticale è 1136 (iPhone5) o 960 (iPhone4). Una delle cose che voglio fare è regolare l'altezza del mio UITableViewCells in un UITableView in modo che non vengano visualizzate celle parziali quando l'app viene eseguita su entrambi i telefoni.Il modo migliore per rilevare il tipo di hardware, iPhone4 o iPhone5?

La mia domanda è: qual è il modo migliore per rilevare il tipo di hardware del telefono in uso in modo che possa apportare le modifiche appropriate al mio layout di visualizzazione?

+0

Alcune buone risposte, http://stackoverflow.com/questions/1108859/detect-the-specific-iphone-ipod-touch-model – sleepwalkerfx

risposta

8

Si dovrebbe utilizzare le funzioni di layout automatico per rendere le vostre opinioni adattarsi a qualsiasi formato di schermo è.

Tuttavia, se volete sapere se il dispositivo è un 5 iPhone unico (cioè ha 1136px di altezza) si può utilizzare:

[ [ UIScreen mainScreen ] bounds ].size.height 

Potrebbe naturalmente essere trasformato in una macro.

+1

Non penso che tu possa usare l'autolayout per impostare l'altezza di UITableViewCells, avrò un altro aspetto nel caso in cui mi sia sfuggito qualcosa. – fuzzygoat

+0

Penso che tu possa. Definisci i tuoi vincoli a livello di codice usando NSLayoutConstraint. –

+0

Potresti usare l'autolayout e gestire ancora correttamente le differenze di layout tra un iPhone4 e iPhone5? –

16

Non ho iPhone 5, ma dall'altra telefono questo codice funzionato alla grande:

NSMutableDictionary *devices = [[NSMutableDictionary alloc] init]; 
[devices setObject:@"simulator"      forKey:@"i386"]; 
[devices setObject:@"iPod Touch"     forKey:@"iPod1,1"]; 
[devices setObject:@"iPod Touch Second Generation" forKey:@"iPod2,1"]; 
[devices setObject:@"iPod Touch Third Generation" forKey:@"iPod3,1"]; 
[devices setObject:@"iPod Touch Fourth Generation" forKey:@"iPod4,1"]; 
[devices setObject:@"iPhone"      forKey:@"iPhone1,1"]; 
[devices setObject:@"iPhone 3G"      forKey:@"iPhone1,2"]; 
[devices setObject:@"iPhone 3GS"     forKey:@"iPhone2,1"]; 
[devices setObject:@"iPad"       forKey:@"iPad1,1"]; 
[devices setObject:@"iPad 2"      forKey:@"iPad2,1"]; 
[devices setObject:@"iPhone 4"      forKey:@"iPhone3,1"]; 
[devices setObject:@"iPhone 4S"      forKey:@"iPhone4"]; 
[devices setObject:@"iPhone 5"      forKey:@"iPhone5"]; 

- (NSString *) getDeviceModel 
{ 
    struct utsname systemInfo; 
    uname(&systemInfo); 
    return [devices objectForKey:[NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]]; 
} 

Ricordati di importare:

#import "sys/utsname.h" 
+2

Questo dovrebbe essere la risposta. Affidarsi alle dimensioni dello schermo è sbagliato in così tanti livelli. – 3d0

+0

@ 3d0, quale sarebbe un livello che fare affidamento sulla dimensione dello schermo è sbagliato? –

+0

Sai che puoi costruire un'app compatibile con iPhone5 usando le dimensioni degli iPhone precedenti (la tua app avrà bordi neri). Se si utilizza la dimensione dello schermo, il sistema produrrà la dimensione dell'app (la stessa dimensione di iPhone4). Nel simulatore è peggio. – 3d0

2
#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES) 

definire questa macro in qualche file constant.h e usarlo dove controllare

if(IS_IPHONE5) 
{ 
// iphone 5 
} 
else 
{ 
// earlier 
} 
2

Dalla tua domanda, sembra che tu voglia correggere l'interfaccia utente a seconda del dispositivo e della risoluzione. In tal caso, va bene ed è possibile utilizzare sotto il codice indicato per identificare il dispositivo. Ma per le cose non dell'interfaccia utente, come cercare una funzionalità del dispositivo che è presente in un dispositivo, assente in altro, è sempre consigliabile verificare se tale capacità sia presente, piuttosto che il modello del dispositivo. Da Apple official forum. (Login richiesto)

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ 
    if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) { 
    CGSize result = [[UIScreen mainScreen] bounds].size; 
    CGFloat scale = [UIScreen mainScreen].scale; 
    result = CGSizeMake(result.width * scale, result.height * scale); 

    if(result.height == 960){ 
     NSLog(@"iphone 4, 4s retina resolution"); 
    } 
    if(result.height == 1136){ 
     NSLog(@"iphone 5 resolution"); 
    } 
    }else{ 
    NSLog(@"iphone standard resolution"); 
    } 
}else{ 
    if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) { 
    NSLog(@"ipad Retina resolution"); 
    }else{ 
    NSLog(@"ipad Standard resolution"); 
    } 
} 
1

Ho controllato le proporzioni. Non così generale come alcuni degli altri metodi, ma ancora più flessibile per i dispositivi futuri rispetto al controllo di una risoluzione specifica.

// 0.563380 = 16x9 (iPhone 5) 
// 0.666667 = 3x2 (iPhone 4S and previous) 
CGFloat aspectRatio = [UIScreen mainScreen].bounds.size.width/[UIScreen mainScreen].bounds.size.height; 
// Tall Screen 
if (aspectRatio > 0.55 && aspectRatio < 0.57) { 
    // Tall screen stuff. 
    } 

    // Short Screen 
} else if (aspectRatio > 0.64 && aspectRatio < 0.68) { 

    // Short screen stuff. 
    } 
} 
Problemi correlati