2012-10-24 11 views
7

Konfiguruję aplikację, w której chcę wprowadzić szereg zmian w układzie widoku w zależności od używanego iPhone'a. W szczególności chcę wiedzieć, czy rozdzielczość ekranu w pionie to 1136 (iPhone5) lub 960 (iPhone4). Jedną z rzeczy, które chcę zrobić, to dostosować wysokość moich UITableViewCells w UITableView tak, aby żadne częściowe komórki nie były wyświetlane, gdy aplikacja jest uruchomiona na każdym telefonie.Najlepszy sposób na wykrycie typu sprzętu, iPhone4 lub iPhone5?

Moje pytanie brzmi: jaki jest najlepszy sposób wykrywania używanego sprzętu telefonicznego, aby móc wprowadzić odpowiednie zmiany w moim układzie widoku?

+0

Kilka dobrych odpowiedzi, http://stackoverflow.com/questions/1108859/detect-the-specific-iphone-ipod-touch-model – sleepwalkerfx

Odpowiedz

8

Należy naprawdę wykorzystać funkcje autolayout aby dostosować swoje poglądy na cokolwiek Format ekranu jest.

Jednakże, jeśli tylko chcą wiedzieć, czy urządzenie jest iPhone 5 (czyli ma 1136px wysokości) można użyć:

[ [ UIScreen mainScreen ] bounds ].size.height 

można oczywiście zostać przekształcony w makro.

+1

Nie sądzę, że można użyć autolayout do ustawienia wysokości UITableViewCells, będę miał inny wygląd na wypadek, gdybym coś przeoczył. – fuzzygoat

+0

Myślę, że możesz. Definiowanie własnych ograniczeń programowo za pomocą NSLayoutConstraint. –

+0

Czy możesz użyć autolayout i nadal poprawnie radzić sobie z różnicami w układzie między iPhone4 i iPhone5? –

16

nie mam iPhone 5, ale na innym telefonie ten kod działał świetnie:

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

Pamiętaj, aby importować:

#import "sys/utsname.h" 
+2

ta powinna być odpowiedź. Poleganie na rozmiarze ekranu jest nieprawidłowe na tak wielu poziomach. – 3d0

+0

@ 3d0, jaki byłby jeden poziom, który polegałby na rozmiarze ekranu? –

+0

Wiesz, że możesz zbudować aplikację kompatybilną z iPhone5, korzystając z rozmiaru poprzednich iPhone'ów (Twoja aplikacja będzie miała czarne ramki). Jeśli użyjesz rozmiaru ekranu, system przyniesie rozmiar aplikacji (ten sam rozmiar iPhone4). W symulatorze jest gorzej. – 3d0

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

zdefiniowania tego makra w jakimś pliku i constant.h użyj go w dowolnym miejscu, aby sprawdzić

2

Z Twojego pytania wynika, że ​​chcesz poprawić interfejs użytkownika w zależności od urządzenia i rozdzielczości. W takim przypadku wszystko jest w porządku i można użyć poniższego kodu do identyfikacji urządzenia. Ale dla rzeczy niezwiązanych z interfejsem użytkownika, takich jak szukanie możliwości urządzenia, które są obecne w jednym urządzeniu, nieobecne w innych, zawsze zaleca się sprawdzenie, czy ta zdolność jest obecna, a nie która jest modelem urządzenia. Od Apple official forum. (login wymagany)

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

Sprawdzałem proporcje. Nie tak ogólne jak niektóre inne metody, ale wciąż bardziej elastyczne dla przyszłych urządzeń niż sprawdzanie określonej rozdzielczości.

// 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. 
    } 
} 
Powiązane problemy