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

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

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

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

487
задан 12 сент. '12 в 22:44
источник поделиться
30 ответов
  1. Загрузите и установите последнюю версию Xcode.
  2. Установите файл экрана запуска для вашего приложения (на общей вкладке ваших целевых настроек). Вот как вы можете использовать полный размер любого экрана, включая размеры разделенного экрана iPad в iOS 9.
  3. Протестируйте свое приложение и, надеюсь, больше ничего не сделайте, поскольку все должно работать волшебным образом, если вы правильно установили маски автоматического изменения размера или использовали автоматическое расположение.
  4. Если вы этого не сделали, настройте макеты просмотра, предпочтительно с помощью Auto Layout.
  5. Если есть что-то, что вам нужно сделать специально для больших экранов, то похоже, что вы должны проверить высоту [[UIScreen mainScreen] bounds] как для этого, похоже, нет конкретного API. Начиная с iOS 8 есть также классы размеров, которые абстрагируют размеры экрана в обычный или компактный по вертикали и горизонтали и рекомендуют способ адаптации вашего пользовательского интерфейса.
476
ответ дан 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
    }
}
116
ответ дан 19 сент. '12 в 23:27
источник

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

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

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

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

30
ответ дан 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.

22
ответ дан 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
ответ дан 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
ответ дан 21 дек. '12 в 10:52
источник

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

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

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

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

10
ответ дан 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
ответ дан 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
ответ дан 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
ответ дан 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
ответ дан 07 авг. '13 в 8:19
источник

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

-(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
ответ дан 19 марта '13 в 9:16
источник

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

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

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

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

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

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

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

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

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

6
ответ дан 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
ответ дан 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
ответ дан 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
ответ дан 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
ответ дан 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
ответ дан 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
ответ дан 29 июня '13 в 13:55
источник

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

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

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

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
ответ дан 30 авг. '13 в 17:12
источник

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

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

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

Существует небольшая проблема при тестировании как на 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
ответ дан 10 окт. '14 в 14:03
источник

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

0
ответ дан 06 окт. '14 в 11:36
источник

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

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

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

enter image description here

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

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

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

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

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

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

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

Другие вопросы по меткам или Задайте вопрос