Приложения iOS 6 - как бороться с размером экрана iPhone 5?

Возможный дубликат:
Как разрабатывать или переносить приложения для разрешения экрана iPhone 5?

Мне просто интересно, как мы должны иметь дело с размером экрана размером экрана iPhone 5.

Поскольку у него больше пикселей по высоте, такие вещи, как GCRectMake, которые используют координаты (и только удваивают пиксели с проблемой сетчатки/не сетчатки), не будут работать без проблем между версиями, поскольку это произошло, когда мы получили Retina.

И нужно ли нам создавать две раскадровки, как и для iPad?

Я лично не думаю, что Apple потребует от вас проверять размер экрана каждый раз, когда вам нужно что-то нарисовать, как говорят многие ответы. Это происходит с iPad?

Ответ 1

Все приложения будут продолжать работать на экране с вертикальным растяжением, что я мог бы сказать в сегодняшней презентации. Они будут иметь почтовый ящик или в основном дополнительные 88 точек в высоту будут просто черными.

Если вы планируете поддерживать только iOS 6+, тогда обязательно рассмотрите возможность использования автоматической компоновки. Он удаляет всю фиксированную обработку макета и вместо этого использует ограничения для прокладки. Ничто не будет жестко закодировано, и ваша жизнь станет намного проще.

Однако, если вам нужно поддерживать более старые iOS, это действительно зависит от вашего приложения. Большинство приложений, которые используют стандартную панель навигации и/или панель вкладок, могут просто расширить содержимое в середине, чтобы использовать дополнительные очки. Установите маску авторезистирования центра содержимого для расширения в обоих направлениях.

view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
Тем не менее, он отлично работает в представлении таблиц, если ваше приложение использует идеальный макет для отображения содержимого, тогда лучше всего переосмыслить контент, чтобы он мог вмещать различные высоты.

Если это не так, то единственным оставшимся вариантом является наличие двух пользовательских интерфейсов (pre iPhone 5 и iPhone 5).

Если это звучит уродливо, тогда вы можете пойти с моделью почтового ящика по умолчанию, где дополнительные точки/пиксели просто отображаются черным.

Edit

Чтобы ваши приложения могли работать с iPhone 5, вам нужно добавить ретинальную версию изображения пусковой установки. Его следует называть [email protected]. И это должно быть качество сетчатки - здесь нет обратной совместимости:)

Вы также можете выбрать это изображение из Xcode. Перейдите к цели, и в разделе "Сводка" найдите "Запуск изображений". Размер изображения должен быть 640x1136 пикселей. Вот скриншот о том, где его найти, если это поможет.

Xcode screenshot

Ответ 2

Вам нужно добавить 640x1136 пикселей PNG изображение ([email protected]) в качестве 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
    }

Ответ 3

Я только что закончил обновление и отправку 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.
  • Название изображения по умолчанию: [email protected], а размер - 640 и раз; 1136. Также разрешено подавать 640 раз и 1096 для того же портретного режима (панель состояния удалена). Подобные размеры могут также поставляться в ландшафтном режиме, если ваше приложение разрешает только ориентацию на iPhone.
  • Я потерял обратную совместимость для iOS 4. Основная причина этого в том, что поддержка кода armv6 была отброшена. Таким образом, все устройства, которые я могу поддерживать сейчас (запуск armv7), можно обновить до iOS 5.
  • Я также создаю код armv7s для поддержки iPhone 5 и, следовательно, могу не использовать сторонние рамки (как Admob и т.д.), пока они не станут обновлены.

Это все, но просто не забудьте проверить авторотацию в iOS 5 и iOS 6 из-за изменений в повороте.

Ответ 4

Нет.

if ([[UIScreen mainScreen] bounds].size.height > 960)

на iPhone 5 ошибочно

if ([[UIScreen mainScreen] bounds].size.height == 568)

Ответ 5

@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)`

Ни один из способов не имеет большого преимущества друг перед другом, это просто личное предпочтение.

Ответ 6

Комментарий @Pascal по вопросу OP правильный. Просто добавив изображение, он удалит черные границы, и приложение будет использовать всю высоту.

Вам нужно будет внести коррективы в любые CGR, установив, что устройство использует большой экран. То есть Если вам нужно что-то выровненное в нижней части экрана.

Я уверен, что есть встроенный метод, но я ничего не видел, и многое еще находится под NDA, поэтому метод, который мы используем в наших приложениях, - это просто глобальная функция. Добавьте следующее в ваш .pch файл, а затем его простой вызов if( is4InchRetina() ) { ... }, чтобы внести коррективы в ваши CGR и т.д.

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;
}

Ответ 7

Я думаю, вы можете использовать [UIScreen mainScreen].bounds.size.height и вычислить шаг для своих объектов. при вычислении шага вы можете установить координаты для двух разрешений.

Или вы можете получить высоту, как указано выше, и if(iphone5) then... else if(iphone4) then... else if(ipad). Что-то вроде этого.

Если вы используете раскадровки, вам нужно создать новый для нового iPhone, который я думаю.

Ответ 8

Поскольку у него больше пикселей по высоте, такие вещи, как GCRectMake, которые используют координаты, не будут работать без проблем между версиями, как это произошло, когда мы получили Retina.

Ну, они делают работают одинаково с дисплеями Retina - это всего лишь то, что 1 единица в системе координат CoreGraphics будет соответствовать двум физическим пикселям, но вам не нужно/не нужно делать ничего, логика осталась прежней. (Вы когда-нибудь пытались запустить одно из своих приложений без сетчатки на iPhone сетчатки?)

Для фактического вопроса: почему вы не должны использовать явные CGRectMakes и co... Вот почему у вас есть такие вещи, как [[UIScreen mainScreen] applicationFrame].