Прежде всего, вы не должны перестраивать все ваши представления, чтобы соответствовать новому экрану, или использовать разные представления для разных размеров экрана.
Используйте возможности автоматического изменения размера iOS, чтобы ваши представления могли корректироваться и адаптироваться к любому размеру экрана.
Это не очень сложно, почитайте документацию об этом. Это сэкономит вам много времени.
iOS 6 также предлагает новые функции по этому поводу.
Обязательно прочтите журнал изменений API iOS 6 на веб-сайте Apple Developer.
И проверьте новые возможности iOS 6 AutoLayout .
Тем не менее, если вам действительно нужно обнаружить iPhone 5, вы можете просто положиться на размер экрана .
[ [ UIScreen mainScreen ] bounds ].size.height
Экран iPhone 5 имеет высоту 568.
Вы можете представить макрос, чтобы упростить все это:
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
Использование fabs
с epsilon здесь для предотвращения ошибок точности при сравнении чисел с плавающей запятой, как указано в комментариях H2CO3.
Так что теперь вы можете использовать его в стандартных операторах if / else:
if( IS_IPHONE_5 )
{}
else
{}
Edit - лучшее обнаружение
Как утверждают некоторые люди, это только обнаруживает широкоэкранный , а не реальный iPhone 5.
В следующих версиях iPod touch также может быть такой экран, поэтому мы можем использовать другой набор макросов.
Давайте переименуем оригинальный макрос IS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
И давайте добавим макросы определения модели:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
Таким образом, мы можем убедиться, что у нас есть модель iPhone и широкоформатный экран, и мы можем переопределить IS_IPHONE_5
макрос:
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
Также обратите внимание, что, как утверждает @ LearnCocos2D, эти макросы не будут работать, если приложение не оптимизировано для экрана iPhone 5 (без изображения Default-568h@2x.png), так как размер экрана в таком случае будет 320x480. случай.
Я не думаю, что это может быть проблемой, так как я не понимаю, почему мы хотели бы обнаружить iPhone 5 в неоптимизированном приложении.
ВАЖНО - поддержка iOS 8
В iOS 8 bounds
свойство UIScreen
класса теперь отражает ориентацию устройства .
Очевидно, что предыдущий код не будет работать из коробки.
Чтобы исправить это, вы можете просто использовать новое nativeBounds
свойство вместо того bounds
, чтобы оно не изменялось в зависимости от ориентации, и поскольку оно основано на портретном режиме.
Обратите внимание, что размеры nativeBounds
измеряются в пикселях, поэтому для iPhone 5 высота будет 1136 вместо 568.
Если вы также ориентируетесь на iOS 7 или ниже, обязательно используйте функцию обнаружения функций, поскольку вызов nativeBounds
до iOS 8 приведет к сбою приложения:
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
Вы можете адаптировать предыдущие макросы следующим образом:
#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 )
И, очевидно, если вам нужно обнаружить iPhone 6 или 6 Plus, используйте соответствующие размеры экрана.