Przede wszystkim nie należy odbudowywać wszystkich widoków, aby zmieściły się na nowym ekranie, ani nie używać różnych widoków dla różnych rozmiarów ekranu.
Korzystaj z funkcji automatycznego zmiany rozmiaru systemu iOS, aby Twoje widoki mogły dostosowywać i dostosowywać dowolny rozmiar ekranu.
To nie jest bardzo trudne, przeczytaj dokumentację na ten temat. Zaoszczędzi ci dużo czasu.
iOS 6 oferuje również nowe funkcje w tym zakresie.
Przeczytaj dziennik zmian interfejsu API systemu iOS 6 w witrynie Apple Developer.
I sprawdź nowe możliwości AutoLayout dla iOS 6 .
To powiedziawszy, jeśli naprawdę potrzebujesz wykryć iPhone'a 5, możesz po prostu polegać na rozmiarze ekranu .
[ [ UIScreen mainScreen ] bounds ].size.height
Wysokość ekranu iPhone'a 5 wynosi 568.
Możesz wyobrazić sobie makro, aby uprościć to wszystko:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Zastosowanie fabs
epsilon ma na celu zapobieganie błędom precyzji podczas porównywania zmiennoprzecinkowych, jak wskazano w komentarzach H2CO3.
Od teraz możesz używać go w standardowych instrukcjach if / else:
if( IS_IPHONE_5 )
{}
else
{}
Edycja - lepsze wykrywanie
Jak twierdzą niektóre osoby, wykrywa to tylko ekran panoramiczny , a nie rzeczywisty iPhone 5.
Kolejne wersje iPoda touch mogą mieć taki ekran, więc możemy użyć innego zestawu makr.
Zmieńmy nazwę oryginalnego makra IS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Dodajmy makra do wykrywania modeli:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
W ten sposób możemy upewnić się, że mamy model iPhone'a ORAZ ekran panoramiczny, i możemy ponownie zdefiniować IS_IPHONE_5
makro:
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
Należy również pamiętać, że, jak stwierdził @ LearnCocos2D, te makra nie będą działać, jeśli aplikacja nie zostanie zoptymalizowana pod kątem ekranu iPhone'a 5 (brakuje obrazu Default-568h@2x.png), ponieważ rozmiar ekranu nadal będzie wynosił 320 x 480 sprawa.
Nie sądzę, że może to stanowić problem, ponieważ nie rozumiem, dlaczego chcielibyśmy wykryć iPhone'a 5 w niezoptymalizowanej aplikacji.
WAŻNE - obsługa iOS 8
W iOS 8 bounds
właściwość UIScreen
klasy odzwierciedla teraz orientację urządzenia .
Tak więc oczywiście poprzedni kod nie zadziała po wyjęciu z pudełka.
Aby to naprawić, możesz po prostu użyć nowej nativeBounds
właściwości zamiast bounds
, ponieważ nie zmieni się ona wraz z orientacją i ponieważ jest oparta na trybie portretowym.
Pamiętaj, że wymiary nativeBounds
są mierzone w pikselach, więc dla iPhone'a 5 wysokość wyniesie 1136 zamiast 568.
Jeśli kierujesz reklamy również na iOS 7 lub niższy, pamiętaj o wykrywaniu funkcji, ponieważ dzwonienie nativeBounds
przed iOS 8 spowoduje awarię aplikacji:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
Możesz dostosować poprzednie makra w następujący sposób:
#define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
#define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON )
#define IS_WIDESCREEN ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_WIDESCREEN_IOS8 : IS_WIDESCREEN_IOS7 )
I oczywiście, jeśli chcesz wykryć iPhone'a 6 lub 6 Plus, użyj odpowiednich rozmiarów ekranu.