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

Новый дисплей iPhone 5 имеет новое соотношение сторон и новое разрешение (640 x 1136 пикселей).

Что требуется для разработки новых или переноса уже существующих приложений на новый размер экрана?

Что мы должны делать, чтобы сделать приложения "универсальными" как для более старых дисплеев, так и для нового широкоформатного формата?

471
задан Lukasz 12 сент. '12 в 22:44
источник поделиться

30 ответов

  • Загрузите и установите последнюю версию Xcode.
  • Установите файл экрана запуска для вашего приложения (на общей вкладке целевых настроек). Таким образом, вы можете использовать полный размер любого экрана, включая размеры разделов iPad в iOS 9.
  • Проверьте свое приложение и, надеюсь, ничего не сделайте, поскольку все должно работать волшебным образом, если вы правильно настроили маски для изменения размера или использовали автоматический макет.
  • Если вы этого не сделали, настройте макеты просмотра, предпочтительно с помощью Auto Layout.
  • Если вам нужно что-то делать для более крупных экранов, то похоже, что вам нужно проверить высоту [[UIScreen mainScreen] bounds], поскольку для этого, похоже, нет конкретного API. Начиная с iOS 8 существуют также классы размеров, которые отформатируют размеры экрана на регулярные или компактные по вертикали и горизонтали и рекомендуются для адаптации вашего пользовательского интерфейса.
468
ответ дан Filip Radelic 13 сент. '12 в 2:13
источник поделиться

Если у вас есть приложение, созданное для iPhone 4S или ранее, оно будет работать на почтовом ящике на iPhone 5.

Чтобы адаптировать приложение к новому более высокому экрану, первое, что вы делаете, - изменить образ запуска на: Default-568h@2x.png. Его размер должен быть 1136x640 (HxW). Да, имея изображение по умолчанию в новом размере экрана, это ключ, позволяющий вашему приложению использовать весь новый экран iPhone 5.

(Обратите внимание, что соглашение об именах работает только для изображения по умолчанию. Именование другого изображения "Image-568h@2x.png" не приведет к его загрузке вместо "Image@2x.png". загружать разные изображения для разных размеров экрана, вам придется делать это программно.)

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

  • Убедитесь, что ваши Xibs/Views используют автоматическую компоновку для изменения размера.
  • Используйте springs и struts для изменения размеров.
  • Если это недостаточно для вашего приложения, спроектируйте xib/раскадровку для одного конкретного размера экрана и программно другой.

В крайнем случае (когда ни один из вышеперечисленных не хватает), спроектируйте два Xibs и загрузите соответствующий в контроллер вида.

Чтобы определить размер экрана:

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
    }
    if(result.height == 568)
    {
        // iPhone 5
    }
}
114
ответ дан Sanjay Chaudhry 19 сент. '12 в 23:27
источник поделиться

Единственная действительно необходимая вещь - добавить изображение запуска с именем "Default-568h@2x.png" к ресурсам приложения, и в общем случае (если вам повезет) приложение будет работать правильно.

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

[window setFrame:[[UIScreen mainScreen] bounds]]

При переходе на iOS существуют другие проблемы, не связанные с размером экрана. 6. Подробнее читайте Примечания к выпуску iOS 6.0.

29
ответ дан onegray 16 сент. '12 в 7:12
источник поделиться

Иногда (для приложений до раскадровки), если макет будет достаточно другим, стоит указать другой xib в соответствии с устройством (см. этот вопрос - вам нужно будет изменить код для работы с iPhone 5) в initController init, так как никакое количество операций с автоматическими масками не будет работать, если вам нужна другая графика.

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    NSString *myNibName;
    if ([MyDeviceInfoUtility isiPhone5]) myNibName = @"MyNibIP5";
    else myNibName = @"MyNib";

    if ((self = [super initWithNibName:myNibName bundle:nibBundleOrNil])) {


...

Это полезно для приложений, ориентированных на более старые версии iOS.

23
ответ дан SomaMan 11 окт. '12 в 11:56
источник поделиться

Здесь вы можете найти хороший учебник (для MonoTouch, но вы также можете использовать информацию для проектов Non-MonoTouch):
http://redth.info/get-your-monotouch-apps-ready-for-iphone-5-ios-6-today/

  • Создайте новое изображение для экрана всплеска/по умолчанию (640 x 1136 пикселей) с именем " Default-568h@2x.png"

  • В симуляторе iOS перейдите в меню "Оборудование → устройство" и выберите " iPhone (Retina 4-inch)"

  • Создайте другие изображения, например. фоновые изображения

  • Обнаружение iPhone 5 для загрузки новых изображений:

public static bool IsTall
{
    get {
        return UIDevice.currentDevice.userInterfaceIdiom
                    == UIUserInterfaceIdiomPhone
                && UIScreen.mainScreen.bounds.size.height
                    * UIScreen.mainScreen.scale >= 1136;
    }
}

private static string tallMagic = "-568h@2x";
public static UIImage FromBundle16x9(string path)
{
    //adopt the -568h@2x naming convention
    if(IsTall())
    {
        var imagePath = Path.GetDirectoryName(path.ToString());
        var imageFile = Path.GetFileNameWithoutExtension(path.ToString());
        var imageExt = Path.GetExtension(path.ToString());
        imageFile = imageFile + tallMagic + imageExt;
        return UIImage.FromFile(Path.Combine(imagePath,imageFile));
    }
    else
    {
        return UIImage.FromBundle(path.ToString());
    }
}
20
ответ дан Manni 17 сент. '12 в 16:55
источник поделиться

Легко переносить iPhone5 и iPhone4 через XIB.........

UIViewController *viewController3;
if ([[UIScreen mainScreen] bounds].size.height == 568)
{
    UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone5screen" bundle:nil] autorelease];               
}    
else
{
     UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone4screen" bundle:nil] autorelease];
}
13
ответ дан shankar 21 дек. '12 в 10:52
источник поделиться

Я решаю эту проблему здесь. Просто добавьте ~ 568h @2x суффикс к изображениям и ~ 568h к xib. Нет необходимости в дополнительных проверках времени выполнения или изменениях кода.

12
ответ дан Shimanski Artem 27 нояб. '12 в 11:02
источник поделиться

Я добавил новый образ запуска по умолчанию и (при проверке нескольких других ответов SE...) убедился, что мои раскадровки полностью автоматизированы и подглядывают, но сетчатка 4 дюйма по-прежнему имеет почтовый ящик.

Затем я заметил, что в моем информационном plist была позиция для "Launch image", установленная на "Default.png", которую я, таким образом, удалил, и волшебный почтовый ящик больше не появился. Надеюсь, это спасет кого-то еще такое же безумие, которое я пережил.

10
ответ дан SkeletonJelly 26 окт. '12 в 19:50
источник поделиться

В файле constants.h вы можете добавить эти инструкции define:

 #define IS_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad 
 #define IS_IPHONE UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone
 #define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON) 
 #define IS_IPHONE_5 (!IS_IPAD && IS_WIDESCREEN)
9
ответ дан Khwarezm Shah 29 янв. '13 в 11:11
источник поделиться

Я предполагаю, что он не будет работать во всех случаях, но в моем конкретном проекте он избегал дублирования NIB файлов:

Где-то в common.h вы можете сделать эти определения основаны на высоте экрана:

#define HEIGHT_IPHONE_5 568
#define IS_IPHONE   ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 ([[UIScreen mainScreen] bounds ].size.height == HEIGHT_IPHONE_5)

В вашем базовом контроллере:

- (void)viewDidLoad
{
    [super viewDidLoad];
    if (IS_IPHONE_5) {
        CGRect r = self.view.frame;
        r.size.height = HEIGHT_IPHONE_5 - 20;
        self.view.frame = r;
    }
    // now the view is stretched properly and not pushed to the bottom
    // it is pushed to the top instead...

    // other code goes here...
}
9
ответ дан iutinvg 26 марта '13 в 10:06
источник поделиться

Чтобы определить, может ли ваше приложение поддерживать iPhone 5 Retina, используйте это: (Это может быть более надежным, чтобы вернуть тип отображения, 4S Retina и т.д., Но, как написано ниже, он просто возвращается, если iPhone поддерживает Retina как iOS5 как ДА или НЕТ)

В общем файле ".h" добавьте:

BOOL IS_IPHONE5_RETINA(void);

В общем файле ".m" добавьте:

BOOL IS_IPHONE5_RETINA(void) {
    BOOL isiPhone5Retina = NO;
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        if ([UIScreen mainScreen].scale == 2.0f) {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            CGFloat scale = [UIScreen mainScreen].scale;
            result = CGSizeMake(result.width * scale, result.height * scale);

            if(result.height == 960){
                //NSLog(@"iPhone 4, 4s Retina Resolution");
            }
            if(result.height == 1136){
                //NSLog(@"iPhone 5 Resolution");
                isiPhone5Retina = YES;
            }
        } else {
            //NSLog(@"iPhone Standard Resolution");
        }
    }
    return isiPhone5Retina;
}
9
ответ дан Mike 29 окт. '12 в 0:55
источник поделиться

Прежде всего создайте два xibs и прикрепите все делегаты, основной класс к xib, а затем u можете поместить это условие, упомянутое ниже, в ваш appdelegate.m файл в

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

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

        self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone5" bundle:nil];
        }

        else
        {
             self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone4" bundle:nil];

        }

вы можете использовать его в любом месте программы в зависимости от ваших требований даже в ваших классах ViewController. Самое главное, что вы создали два xib файла, разделенных для iphone 4(320*480) and iphone 5(320*568)

8
ответ дан mandeep 07 авг. '13 в 8:19
источник поделиться

Проверка bounds с помощью 568 не будет выполнена в альбомном режиме. iPhone 5 запускается только в портретном режиме, но если вы хотите поддерживать вращения, то для проверки этого сценария также потребуется обработать iPhone 5.

Здесь макрос, который обрабатывает состояние ориентации:

#define IS_IPHONE_5 (CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size, CGSizeMake(640, 1136)))

Использование вызова "preferredMode" происходит из другого сообщения, которое я прочитал несколько часов назад, поэтому я не придумал эту идею.

7
ответ дан Christopher 04 февр. '13 в 9:42
источник поделиться

Вы можете использовать функцию Auto Layout и создать дизайн с использованием разрешения экрана iPhone 5, и он будет работать для обоих 4-дюймовых и 3,5-дюймовых устройств, но в этом случае у вас должно быть достаточно знаний менеджера компоновки.

7
ответ дан DeveshM 16 февр. '13 в 12:40
источник поделиться

Попробуйте метод ниже в одном классе:

-(NSString *)typeOfDevice
    {
        if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
        {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            if(result.height == 480)
            {
                return @"Iphone";
            }
            if(result.height == 568)
            {
                return @"Iphone 5";
            }
        }
        else{
            return @"Ipad";;
        }


        return @"Iphone";
    }
7
ответ дан Mohammed Ebrahim 19 марта '13 в 9:16
источник поделиться

Я никогда не сталкивался с такой проблемой с каким-либо устройством, поскольку у меня была одна кодовая база для всех без каких-либо жестко заданных значений. То, что я делаю, - это изображение максимального размера как ресурс вместо одного для каждого устройства. Например, у меня будет один для отображения сетчатки и показать его как подходящий для аспект, так что он будет отображаться как на каждом устройстве. Принятие решения о кадре кнопки, например, во время выполнения. Для этого я использую значение% видения патента, например, если я хочу, чтобы ширина половины родительского представления составляла 50% от родительского, и то же самое относится к высоте и центру.

При этом мне даже не нужны xibs.

6
ответ дан infiniteLoop 27 нояб. '12 в 21:26
источник поделиться

Сначала покажите это изображение. На этом изображении вы увидите предупреждение для поддержки Retina 4, поэтому нажмите на это предупреждение и нажмите "Добавить", чтобы ваш экран Retina 4 автоматически добавлял ваш проект.

Show image here

и после использования этого кода:

if([[UIScreen mainScreen] bounds].size.height == 568)
    {
        // For iphone 5
    }
    else
    {
        // For iphone 4 or less
    }
6
ответ дан Darshan Kunjadiya 29 июня '13 в 13:06
источник поделиться

Вы можете использовать это определение, чтобы рассчитать, используете ли вы iPhone 5 на основе размера экрана:

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

затем используйте простой оператор if:

    if (IS_IPHONE_5) {

    // What ever changes
    }
5
ответ дан Mutawe 29 апр. '13 в 13:04
источник поделиться

Питер, вы должны действительно взглянуть на Canappi, он делает все это для вас, все, что вам нужно сделать, это указать макет как таковой:

button mySubmitButton 'Sumbit' (100,100,100,30 + 0,88,0,0) { ... }

Оттуда Canappi создаст правильный код objective-c, который обнаружит устройство, на котором работает приложение, и будет использовать:

(100,100,100,30) for iPhone4
(100,**188**,100,30) for iPhone 5

Canappi работает как Interface Builder и Story Board вместе, за исключением того, что он находится в текстовой форме. Если у вас уже есть XIB файлы, вы можете конвертировать их, поэтому вам не нужно воссоздавать весь пользовательский интерфейс с нуля.

4
ответ дан metaprogrammer 25 сент. '12 в 18:30
источник поделиться

Вы можете вручную проверить размер экрана, чтобы определить, на каком устройстве вы находитесь:

#define DEVICE_IS_IPHONE5 ([[UIScreen mainScreen] bounds].size.height == 568)

float height = DEVICE_IS_IPHONE5?568:480;
if (height == 568) {
    // 4"

} else {

    // 3"

}
4
ответ дан Robot1987 04 июня '13 в 12:16
источник поделиться

Вы можете добавить этот код:

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            CGFloat scale = [UIScreen mainScreen].scale;
            result = CGSizeMake(result.width * scale, result.height * scale);

            if(result.height == 960) {
                NSLog(@"iPhone 4 Resolution");
            }
            if(result.height == 1136) {
              NSLog(@"iPhone 5 Resolution");
            }
        }
        else{
            NSLog(@"Standard Resolution");
        }
    }
3
ответ дан dbramhall 23 сент. '12 в 16:53
источник поделиться

Это реальный универсальный код, вы можете создать 3 разных сюжета:

Задайте свой универсальный проект и установите свой основной iPhone для iPhone с раскадрой iPhone5 и основной план iPad с iPad-раскадрой, теперь добавьте новую цель раскадровки для iphone и измените разрешение для iphone 4 или менее, теперь реализуйте свой AppDelegate.m

iPhone4/4s (то же самое для 3/3Gs) для iPhone5 и сделать проект универсальным, с новой целью раскадровки для iPad, теперь в AppDelegate.m под didFinishLaunching добавьте этот код:

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        UIStoryboard *storyBoard;

        CGSize result = [[UIScreen mainScreen] bounds].size;
        CGFloat scale = [UIScreen mainScreen].scale;
        result = CGSizeMake(result.width *scale, result.height *scale);

//----------------HERE WE SETUP FOR IPHONE4/4s/iPod----------------------

        if(result.height == 960){
            storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
            UIViewController *initViewController = [storyBoard instantiateInitialViewController];
            [self.window setRootViewController:initViewController];
        }

//----------------HERE WE SETUP FOR IPHONE3/3s/iPod----------------------

        if(result.height == 480){
            storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
            UIViewController *initViewController = [storyBoard instantiateInitialViewController];
            [self.window setRootViewController:initViewController];
        }
    }

        return YES;
 }

Таким образом, вы создали универсальное приложение для iPhone 3/3Gs/4/4s/5 Все гены iPod и все типы iPad

Не забудьте интегрировать все IMG с myImage.png и myImage@2x.png

3
ответ дан BlackSheep 29 июня '13 в 13:55
источник поделиться

По моему мнению, лучший способ справиться с такими проблемами и избежать пары условий, необходимых для проверки высоты устройства, заключается в использовании относительного кадра для представлений или любого элемента пользовательского интерфейса, который вы добавляете к себе, например: if вы добавляете некоторый элемент пользовательского интерфейса, который вы хотите, в нижней части окна или чуть выше панели вкладок, тогда вы должны взять y-начало относительно высоты вашего представления или относительно панели вкладок (если есть), и у нас есть свойство автоматического изменения размера Что ж. Я надеюсь, что это сработает для вас.

2
ответ дан Pranav Bhardwaj 03 апр. '13 в 15:47
источник поделиться

Если вам нужно преобразовать уже существующее приложение в универсальное, вам нужно выбрать соответствующий xib file- > show Utilities- > Show Size inspector.

В Инспекторе размеров вы можете увидеть Автосообщение, используя этот инструмент, который вы можете преобразовать в существующее приложение iOS.

1
ответ дан Prad 26 янв. '14 в 13:23
источник поделиться

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

int h = [[UIScreen mainScreen] bounds].size.height;
int w = [[UIScreen mainScreen] bounds].size.width;
self.imageView.frame = CGRectMake(20, 80, (h-200), (w-100));

В моем случае я хочу представление, которое заполняет пространство между некоторыми полями ввода вверху и некоторыми кнопками внизу, таким образом фиксированный верхний левый угол и переменная внизу справа на основе размера экрана. Мое приложение заполняет изображение с фотографией, сделанной камерой, поэтому я хочу получить все пространство, которое я могу получить.

1
ответ дан Charles Jaimet 30 авг. '13 в 17:12
источник поделиться

Я бы предложил использовать Autoresizing Mask в ваших приложениях в соответствии с вашим интерфейсом пользовательского интерфейса, это избавит вас от многих проблем и лучше, чем создавать различные интерфейсы для экранов iPhone 4 и 5.

0
ответ дан Geet 08 июля '14 в 11:52
источник поделиться

Используйте функцию Auto Layout для представлений. Он автоматически настроится на все разрешения.

Создайте два xib для контроллера с именем контроллера с суффиксом ~ iphone или ~ ipad. Во время компиляции Xcode будет использовать правильный xib на основе устройства.

Используйте классы размера, если вы хотите создать единый xib для iPhone и iPad, если представление достаточно просто для порта для iPhone и iPad.

0
ответ дан Praveen Matanam 06 янв. '15 в 11:12
источник поделиться

Используя xCode 5, выберите "Перенести в каталог активов" в разделе "Проект" > "Общие".

Затем используйте "Show in finder", чтобы найти образ запуска, вы можете фиктивно редактировать его как 640x1136, а затем перетащить его в каталог активов, как показано на рисунке ниже.

Убедитесь, что в разделе iOS7 и iOS6 R4 есть изображение размером 640x1136.. При следующем запуске приложения черные полосы исчезнут, а ваше приложение будет использовать 4-дюймовый экран

enter image description here

0
ответ дан Alex Stone 08 мая '14 в 18:51
источник поделиться

Существует небольшая проблема при тестировании как на iOS-устройстве, так и на iOS-симуляторе. Похоже, что симулятор (XCode 6.0.1) дает переключаемые значения для ширины и высоты в [[UIScreen mainScreen] bounds].size в зависимости от ориентации устройства.

Таким образом, это может быть проблемой при определении правильного размера физического экрана. Этот код также помогает отличать все поколения iPhone 2014.

  • iPhone4s
  • iPhone5 (и iPhone5)
  • iPhone6 ​​(и iPhone6 ​​+)

Его также можно легко изменить, чтобы провести различие между, например, iPhone6 ​​от iPhone6 ​​+.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone)
    {
        if (iOSDeviceScreenSize.width > 568 || // for iOS devices
            iOSDeviceScreenSize.height > 568) // for iOS simulator
        {   // iPhone 6 and iPhone 6+

            // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone6
            storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone6" bundle:nil];

            NSLog(@"loaded iPhone6 Storyboard");
        }
        else if (iOSDeviceScreenSize.width == 568 || // for iOS devices
                 iOSDeviceScreenSize.height == 568) // for iOS simulator
        {   // iPhone 5 and iPod Touch 5th generation: 4 inch screen (diagonally measured)

            // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone5
            storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil];

            NSLog(@"loaded iPhone5 Storyboard");
        }
        else
        {   // iPhone 3GS, 4, and 4S and iPod Touch 3rd and 4th generation: 3.5 inch screen (diagonally measured)

                // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4
            storyboard = [UIStoryboard story    boardWithName:@"MainStoryboard_iPhone" bundle:nil];

                NSLog(@"loaded iPhone4 Storyboard");
        }
    }
    else if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
    {   // The iOS device = iPad

        storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPadnew" bundle:nil];

        NSLog(@"loaded iPad Storyboard");
    }

    // rest my code
}
0
ответ дан vedrano 10 окт. '14 в 14:03
источник поделиться

Заметьте, стоит отметить - в новом Xcode вы должны добавить этот файл изображения Default-568h@2x.png для активов

0
ответ дан Michal Gumny 06 окт. '14 в 11:36
источник поделиться

Другие вопросы по меткам