Перш за все, ви не повинні перебудовувати всі перегляди, щоб підходити до нового екрану, а також не використовувати різні види для різних розмірів екрана.
Використовуйте можливості автоматичного зміни розміру iOS, щоб ваші перегляди могли коригувати та адаптувати будь-який розмір екрана.
Це не дуже складно, прочитайте про це документацію . Це заощадить вам багато часу.
iOS 6 також пропонує нові функції щодо цього.
Обов’язково прочитайте журнал змін змін 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
епсилон, щоб запобігти помилкам точності при порівнянні плаваючих точок, як зазначено в коментарях H2CO3.
Тож відтепер ви можете використовувати його у стандартних операторах if / else:
if( IS_IPHONE_5 )
{}
else
{}
Редагувати - Краще виявлення
Як заявляють деякі люди, це виявляє лише широкоекранний , а не власне 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 (відсутнє зображення за замовчуванням-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, використовуйте відповідні розміри екрана.