2012-10-24 6 views
7

Ich richte eine Anwendung ein, in der ich eine Reihe von Änderungen am Ansichtslayout basierend auf dem Typ des verwendeten iPhones vornehmen möchte. Insbesondere möchte ich wissen, ob die vertikale Bildschirmauflösung 1136 (iPhone5) oder 960 (iPhone4) ist. Eines der Dinge, die ich tun möchte, ist die Höhe meiner UITableViewCells in einer UITableView anpassen, so dass keine Teilzellen angezeigt werden, wenn die App auf einem der Telefone ausgeführt wird.Der beste Weg, Hardware-Typ zu erkennen, iPhone4 oder iPhone5?

Meine Frage ist: Was ist der beste Weg, den verwendeten Telefonhardwaretyp zu erkennen, damit ich die entsprechenden Änderungen an meinem Ansichtslayout vornehmen kann?

+0

Einige gute Antworten, http://stackoverflow.com/questions/1108859/detect-the-specific-iphone-ipod-touch-model – sleepwalkerfx

Antwort

8

Sie wirklich die automatischen Layout-Funktionen verwenden sollten, Ihre Ansichten machen anpassen, was auch immer Format der Bildschirm ist.

Wenn Sie jedoch nur wissen wollen, ob das Gerät ein iPhone 5 (dh hat 1136px in Höhe) könnten Sie verwenden:

[ [ UIScreen mainScreen ] bounds ].size.height 

Könnte natürlich in ein Makro gedreht werden.

+1

Ich glaube nicht, dass Sie die Höhe von UITableViewCells mit dem automatischen Layout festlegen können. Ich werde einen anderen Look haben, falls ich etwas verpasst habe. – fuzzygoat

+0

Ich denke du kannst. Definieren Sie mithilfe von NSLayoutConstraint programmgesteuert eigene Einschränkungen. –

+0

Könnten Sie das automatische Layout verwenden und trotzdem die Unterschiede im Layout zwischen einem iPhone4 und iPhone5 richtig handhaben? –

16

Ich habe nicht iPhone 5, sondern auf dem anderen Telefon dieser Code hat super funktioniert:

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]]; 
} 

Denken Sie daran, importieren:

#import "sys/utsname.h" 
+2

Dies sollte die Antwort sein. Sich auf die Bildschirmgröße zu verlassen, ist in so vielen Ebenen falsch. – 3d0

+0

@ 3d0, was wäre eine Ebene, die auf die Bildschirmgröße angewiesen ist falsch? –

+0

Sie wissen, dass Sie eine iPhone5-kompatible App mit der Größe der vorherigen iPhones erstellen können (Ihre App wird schwarze Rahmen haben). Wenn Sie die Bildschirmgröße verwenden, ergibt das System die Größe der App (die gleiche Größe von iPhone4). Im Simulator ist es schlechter. – 3d0

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

dieses Makro in einigen constant.h Datei definieren und Verwenden Sie es überall, wo Sie es überprüfen können

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

Von Ihrer Frage scheint es, dass Sie die Benutzeroberfläche je nach Gerät und Auflösung korrigieren möchten. In diesem Fall ist es in Ordnung, und Sie können unten angegebenen Code verwenden, um das Gerät zu identifizieren. Aber für Nicht-UI-Dinge, wie Suchen nach einer Gerätefunktionalität, die in einem Gerät vorhanden ist, in anderen fehlt, wird immer empfohlen, zu prüfen, ob diese Fähigkeit vorhanden ist, und nicht das Gerätemodell. Von Apfel official forum. (Anmeldung erforderlich)

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

Ich habe das Seitenverhältnis überprüft. Nicht so allgemein wie einige der anderen Methoden, aber für zukünftige Geräte noch flexibler als das Überprüfen einer bestimmten Auflösung.

// 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. 
    } 
} 
Verwandte Themen