iOS 6 apps-как справиться с размером экрана iPhone 5? [дубликат]
Возможные Дубликаты:
как разрабатывать или переносить приложения для iPhone 5 разрешение экрана?
Мне просто интересно, как мы должны иметь дело с iPhone 5 большего размера экрана.
поскольку он имеет больше пикселей по высоте, такие вещи, как GCRectMake, которые используют координаты (и просто удваивают пиксели с проблемой retina/non retina), не будут работать без проблем между версиями, как это произошло, когда мы получили сетчатка.
и нам придется проектировать две раскадровки, как и для iPad?
Я лично не думаю, что Apple потребует от вас проверять размер экрана каждый раз, когда вам нужно что-то нарисовать, как говорят многие ответы. Это происходит с iPad?
8 ответов:
все приложения будут продолжать работать в вертикально растянутом экране от того, что я мог бы сказать в сегодняшней презентации. Они будут в почтовом ящике или в основном дополнительные 88 точек по высоте будут просто черными.
Если вы планируете поддерживать только iOS 6+, то обязательно рассмотрите возможность использования Auto Layout. Он удаляет все фиксированные обработки макета и вместо этого использует ограничения, чтобы выложить вещи. Ничего не будет жестко, и ваша жизнь станет намного проще.
однако, если вы должны поддерживать анлок, то это действительно зависит от вашего приложения. Большинство приложений, которые используют стандартную панель навигации и / или панель вкладок, могут просто расширить содержимое в середине, чтобы использовать эти дополнительные точки. Набор маска функциями автоматического изменения содержания центра расширяться в обоих направлениях.
view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Он отлично работает из коробки для просмотра таблиц, однако, если ваше приложение использует пиксель-идеальный макет для отображения контента, то лучше всего было бы переосмыслить содержание так, что оно сможет приспособить меняя высоты.
Если это не возможно, то единственный оставшийся вариант-иметь два UI (pre iPhone 5 и iPhone 5).
Если это звучит некрасиво, то вы можете пойти с моделью по умолчанию letterboxed, где дополнительные точки/пиксели просто отображаются черным цветом.
Edit
чтобы ваши приложения могли работать с iPhone 5,вам нужно добавить сетчатую версию изображения запуска. Он должен быть назван
Default-568h@2x.png
. И это должно быть качество сетчатки-здесь нет обратной совместимости:)вы также можете выбрать это изображение из Xcode. Перейдите к цели и в разделе сводка найдите изображения запуска. Изображение должно быть размером 640x1136 пикселей. Вот скриншот, где его найти, если это поможет.
вам нужно добавить 640x1136 пикселей PNG изображение (
Default-568h@2x.png
) в качестве 4-дюймового изображения всплеска по умолчанию вашего проекта, и он будет использовать дополнительные пространства (без усилий на простых настольных приложениях, игры потребуют больше усилий).Я создал небольшую категорию UIDevice для того, чтобы иметь дело со всеми разрешениями экрана. Вы можете найти здесь, но код выглядит следующим образом:
UIDevice+Резолюции.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
File UIDevice+Резолюции.м:
#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+.H & UIDevice+резолюции.m файлов для вашего проекта
2) добавьте строку #import " Uidevice + Resolutions.h " к вашему ViewController.м
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
метод и настроить макет с помощью прямоугольника границ вида.- модальные контроллеры вида: The
willRotateToInterfaceOrientation:duration:
,willAnimateRotationToInterfaceOrientation:duration:
иdidRotateFromInterfaceOrientation:
методы больше не вызываются любой контроллер вида это делает полноэкранную презентацию более
сам-например,presentViewController:animated:completion:
.- затем я исправил автозапуск для представлений это было необходимо.
- скопировал изображения из симулятора для просмотра при запуске и представления для iTunes store в 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
.м
#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)`
ни один из способов не имеет большого преимущества друг перед другом, это просто личное предпочтение.
комментарий@Pascal на вопрос OP является правильным. Просто добавив изображение, он удаляет черные границы, и приложение будет использовать полную высоту.
вам нужно будет внести изменения в любые 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, которые используют координаты, не будут работать плавно между версиями, как это произошло, когда мы получили сетчатку.
Ну, они do работайте так же с дисплеями Retina - это просто, что 1 единица в системе координат CoreGraphics будет соответствовать 2 физическим пикселям, но вам не нужно ничего делать, логика осталась прежней. (Вы действительно пытались запустить одно из ваших приложений, отличных от retina на iPhone сетчатки, когда-нибудь?)
для фактического вопроса: вот почему вы не должны использовать явные CGRectMakes и co... Вот почему у вас есть такие вещи, как
[[UIScreen mainScreen] applicationFrame]
.