Приложения для iOS 6 - как справиться с размером экрана iPhone 5?
Возможный дубликат:
Как разработать или перенести приложения под разрешение экрана iPhone 5?
Мне было просто интересно, как нам быть с iPhone 5 большим экраном.
Поскольку у него больше пикселей по высоте, такие вещи, как GCRectMake, которые используют координаты (и просто удваивают пиксели с проблемой сетчатки / без сетчатки), не будут работать без проблем между версиями, как это произошло, когда мы получили Retina.
И придется ли нам создавать две раскадровки, как для iPad?
Лично я не думаю, что Apple потребует от вас проверять размер экрана каждый раз, когда вам нужно что-то нарисовать, как говорят многие ответы. Это происходит с iPad?
8 ответов
Все приложения будут продолжать работать на вертикально растянутом экране, о чем я мог рассказать в сегодняшней презентации. Они будут почтовыми ящиками или в основном лишние 88 точек будут просто черными.
Если вы планируете поддерживать только iOS 6+, то обязательно рассмотрите возможность использования Auto Layout. Он удаляет всю фиксированную обработку макетов и вместо этого использует ограничения для разметки. Ничто не будет жестко запрограммировано, и ваша жизнь станет намного проще.
Однако, если вам нужно поддерживать старые iOS, это действительно зависит от вашего приложения. Большинство приложений, использующих стандартную панель навигации и / или панель вкладок, могут просто расширить содержимое в середине, чтобы использовать эти дополнительные точки. Установите маску автоматического изменения размера содержимого центра для расширения в обоих направлениях.
view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Он отлично работает для просмотра таблиц, однако, если ваше приложение использует идеальный по пикселям макет для отображения контента, тогда вам лучше всего переосмыслить контент, чтобы он мог соответствовать разной высоте.
Если это не возможно, то единственный оставшийся вариант - использовать два интерфейса пользователя (до iPhone 5 и iPhone 5).
Если это звучит некрасиво, то вы можете использовать модель с коробками по умолчанию, где дополнительные точки / пиксели просто отображаются черным цветом.
редактировать
Чтобы ваши приложения могли работать с iPhone 5, вам нужно добавить сетчатую версию образа запуска. Должно быть названо Default-568h@2x.png
, И это должно быть качество сетчатки - здесь нет обратной совместимости:)
Вы также можете выбрать это изображение из Xcode. Перейдите к цели и в разделе Summary найдите Launch Images. Размер изображения должен быть 640х1136 пикселей. Вот скриншот, где его найти, если это поможет.
Вам необходимо добавить изображение PNG размером 640x1136 пикселей (Default-568h@2x.png
) в качестве 4-дюймового заставочного изображения по умолчанию для вашего проекта, и в нем будут использоваться дополнительные пробелы (без усилий для простых настольных приложений игры потребуют больше усилий).
Я создал небольшую категорию UIDevice для работы со всеми разрешениями экрана. Вы можете получить его здесь, но код выглядит следующим образом:
Файл UIDevice + Resolutions.h:
enum {
UIDeviceResolution_Unknown = 0,
UIDeviceResolution_iPhoneStandard = 1, // iPhone 1,3,3GS Standard Display (320x480px)
UIDeviceResolution_iPhoneRetina4 = 2, // iPhone 4,4S Retina Display 3.5" (640x960px)
UIDeviceResolution_iPhoneRetina5 = 3, // iPhone 5 Retina Display 4" (640x1136px)
UIDeviceResolution_iPadStandard = 4, // iPad 1,2,mini Standard Display (1024x768px)
UIDeviceResolution_iPadRetina = 5 // iPad 3 Retina Display (2048x1536px)
}; typedef NSUInteger UIDeviceResolution;
@interface UIDevice (Resolutions)
- (UIDeviceResolution)resolution;
NSString *NSStringFromResolution(UIDeviceResolution resolution);
@end
Файл UIDevice + Resolutions.m:
#import "UIDevice+Resolutions.h"
@implementation UIDevice (Resolutions)
- (UIDeviceResolution)resolution
{
UIDeviceResolution resolution = UIDeviceResolution_Unknown;
UIScreen *mainScreen = [UIScreen mainScreen];
CGFloat scale = ([mainScreen respondsToSelector:@selector(scale)] ? mainScreen.scale : 1.0f);
CGFloat pixelHeight = (CGRectGetHeight(mainScreen.bounds) * scale);
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
if (scale == 2.0f) {
if (pixelHeight == 960.0f)
resolution = UIDeviceResolution_iPhoneRetina4;
else if (pixelHeight == 1136.0f)
resolution = UIDeviceResolution_iPhoneRetina5;
} else if (scale == 1.0f && pixelHeight == 480.0f)
resolution = UIDeviceResolution_iPhoneStandard;
} else {
if (scale == 2.0f && pixelHeight == 2048.0f) {
resolution = UIDeviceResolution_iPadRetina;
} else if (scale == 1.0f && pixelHeight == 1024.0f) {
resolution = UIDeviceResolution_iPadStandard;
}
}
return resolution;
}
@end
Вот как вам нужно использовать этот код.
1) Добавьте вышеупомянутые файлы UIDevice+Resolutions.h & UIDevice+Resolutions.m в свой проект
2) Добавьте строку #import "UIDevice+Resolutions.h" в свой ViewController.m
3) Добавьте этот код, чтобы проверить, с какими версиями устройства вы имеете дело
int valueDevice = [[UIDevice currentDevice] resolution];
NSLog(@"valueDevice: %d ...", valueDevice);
if (valueDevice == 0)
{
//unknow device - you got me!
}
else if (valueDevice == 1)
{
//standard iphone 3GS and lower
}
else if (valueDevice == 2)
{
//iphone 4 & 4S
}
else if (valueDevice == 3)
{
//iphone 5
}
else if (valueDevice == 4)
{
//ipad 2
}
else if (valueDevice == 5)
{
//ipad 3 - retina display
}
Я только что закончил обновлять и отправлять версию iOS 6.0 одного из моих приложений в магазин. Эта версия обратно совместима с iOS 5.0, поэтому я сохранил shouldAutorotateToInterfaceOrientation:
метод и добавил новые, как указано ниже.
Я должен был сделать следующее:
В iOS 6 меняется авторотация. В iOS 6 shouldAutorotateToInterfaceOrientation:
метод UIViewController устарел. На его месте вы должны использовать supportedInterfaceOrientationsForWindow:
а также shouldAutorotate
методы. Таким образом, я добавил эти новые методы (и сохранил старые для совместимости с iOS 5):
- (BOOL)shouldAutorotate {
return YES;
}
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAllButUpsideDown;
}
- Использовал вид контроллера
viewWillLayoutSubviews
метод и настроить макет, используя прямоугольник границ вида. - Контроллеры модального вида:
willRotateToInterfaceOrientation:duration:
,willAnimateRotationToInterfaceOrientation:duration:
, а такжеdidRotateFromInterfaceOrientation:
методы больше не вызываются ни на одном контроллере представления, который делает полноэкранное представление поверх
сам, например,presentViewController:animated:completion:
, - Затем я исправил автопоставку для представлений, которые в ней нуждались.
- Скопировал изображения из симулятора для запуска и просмотра для магазина iTunes в PhotoShop и экспортировал их в виде файлов PNG.
- Имя изображения по умолчанию:
Default-568h@2x.png
и размер 640×1136. Также разрешено указывать 640×1096 для того же портретного режима (строка состояния удалена). Аналогичные размеры могут также поставляться в альбомном режиме, если ваше приложение позволяет только iPhone в альбомной ориентации. - Я отказался от обратной совместимости для iOS 4. Основная причина этого в том, что поддержка
armv6
код был удален. Таким образом, все устройства, которые я могу сейчас поддерживать (работаютarmv7
) можно обновить до iOS 5. - Я также генерирую код armv7s для поддержки iPhone 5 и, следовательно, не могу использовать какие-либо сторонние фреймворки (например, Admob и т. Д.), Пока они не будут обновлены.
Это было все, но не забудьте проверить авторотацию в iOS 5 и iOS 6 из-за изменений в ротации.
Нет.
if ([[UIScreen mainScreen] bounds].size.height > 960)
на iPhone 5 не так
if ([[UIScreen mainScreen] bounds].size.height == 568)
@interface UIDevice (Screen)
typedef enum
{
iPhone = 1 << 1,
iPhoneRetina = 1 << 2,
iPhone5 = 1 << 3,
iPad = 1 << 4,
iPadRetina = 1 << 5
} DeviceType;
+ (DeviceType)deviceType;
@end
.m
#import "UIDevice+Screen.h"
@implementation UIDevice (Screen)
+ (DeviceType)deviceType
{
DeviceType thisDevice = 0;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
{
thisDevice |= iPhone;
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
{
thisDevice |= iPhoneRetina;
if ([[UIScreen mainScreen] bounds].size.height == 568)
thisDevice |= iPhone5;
}
}
else
{
thisDevice |= iPad;
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
thisDevice |= iPadRetina;
}
return thisDevice;
}
@end
Таким образом, если вы хотите определить, является ли это просто iPhone или iPad (независимо от размера экрана), вы просто используете:
if ([UIDevice deviceType] & iPhone)
или же
if ([UIDevice deviceType] & iPad)
Если вы хотите обнаружить только iPhone 5, вы можете использовать
if ([UIDevice deviceType] & iPhone5)
В отличие от ответа Malcoms, где вам нужно будет проверить, чтобы выяснить, если это iPhone,
if ([UIDevice currentResolution] == UIDevice_iPhoneHiRes ||
[UIDevice currentResolution] == UIDevice_iPhoneStandardRes ||
[UIDevice currentResolution] == UIDevice_iPhoneTallerHiRes)`
Ни один из способов не имеет большого преимущества друг над другом, это всего лишь личное предпочтение.
@ Паскаль комментирует вопрос ОП правильно. Просто добавляя изображение, оно удаляет черные границы, и приложение будет использовать всю высоту.
Вам нужно будет внести коррективы в любые CGRects, определив, что устройство использует больший дисплей. Т.е. если вам нужно что-то выровнять по нижней части экрана.
Я уверен, что есть встроенный метод, но я ничего не видел, и многие все еще находятся под NDA, поэтому метод, который мы используем в наших приложениях, является просто глобальной функцией. Добавьте следующее в ваш файл.pch, а затем просто if( is4InchRetina() ) { ... }
позвоните, чтобы внести изменения в ваши CGRects и т. д.
static BOOL is4InchRetina()
{
if (![UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 548 || [UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 568)
return YES;
return NO;
}
Я думаю, что вы можете использовать [UIScreen mainScreen].bounds.size.height
и рассчитать шаг для ваших объектов. когда вы рассчитываете шаг, вы можете установить координаты для двух разрешений.
Или вы можете получить высоту, как указано выше и if(iphone5) then... else if(iphone4) then... else if(ipad)
, Что-то вроде этого.
Я думаю, что если вы используете раскадровки, вы должны создать новый для нового iPhone.
Поскольку у него больше пикселей по высоте, такие вещи, как GCRectMake, использующие координаты, не будут работать без проблем между версиями, как это произошло, когда мы получили Retina.
Что ж, они работают одинаково с дисплеями Retina - просто 1 единица в системе координат CoreGraphics будет соответствовать 2 физическим пикселям, но вам ничего не нужно делать, логика осталась прежней. (Вы когда-нибудь пытались запустить одно из своих приложений, не относящихся к сетчатке, на iPhone с сетчаткой ?)
Для фактического вопроса: вот почему вы не должны использовать явные CGRectMakes и co... Вот почему у вас есть такие вещи, как [[UIScreen mainScreen] applicationFrame]
,