Подтвердить что ты не робот

Как сделать xib совместимым с устройствами iphone 5 и iphone 4

Я пытаюсь разместить мой xib так, чтобы макет вписывался как в iphone 5 (4 дюйма сетчатки), так и в 3,5 устройства.

Поскольку мне нужно поддерживать IOS-5, я не могу использовать автозапуск. Я должен использовать пружины и Struts.

Я пробовал все в интерфейсе-строителе. Но либо мой взгляд выходит за пределы iphone-3,5 дюйма или не полностью заполняет iphone-4-inch-retina.

Может кто-нибудь подскажет, как на самом деле сделать xib совместимым с обоими устройствами?

Для большей ясности я добавляю скриншоты:

Когда я установил размер 3.5 в инспекторе атрибутов: When I set size in attribute inspector to 3.5

он выглядит в iphone-5. Под кнопками находится пробел: And this is how it looks in simulator for 3.5 inch device

Если я установил размер 4 дюйма в построителе интерфейса. Вы можете видеть, что нижние кнопки не видны в iphone-4. If I set size 3.5 inch in interface builder

Итак, вы спросите, какие настройки я использую. Вот они:

enter image description hereenter image description hereenter image description here

4b9b3361

Ответ 1

  • Вы добавляете новую категорию для UIviewController и добавляете этот код в файл .h

     - (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil;
    
  • Добавьте этот код в свой .m файл

     - (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil
     {
       if (self = [super init])
     {
      self = [self initWithNibName:[self CheckDeviceIphone4:nibNameOrNil4 Iphone5:nibNameOrNil5 Ipad:nibNameOrNilpad] bundle:nibBundleOrNil];
      }
      return self;
    
    }
    
      -(NSString *)CheckDeviceIphone4:(NSString *)iphone4 Iphone5:(NSString *)iphone5 Ipad:(NSString *)ipad {
    
        return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) ? ipad :([[UIScreen mainScreen] bounds].size.height == 568) ?  iphone5 :iphone4;
      }
    
  • Откройте файл YouProject-Prefix.pch и импортируйте свою категорию здесь

  • теперь вы просто используете это во всем проекте, как этот

     self.firstView=[[firstView alloc]initWithNibNameforIphone4:@"firstView4" NibNameforIphone5:@"firstView" NibNameforIpad:@"firstViewIpad" bundle:[NSBundle mainBundle]];
    

    спасибо и любой вопрос, тогда комментируйте и не забывайте повышать: -)

\

Ответ 2

Попробуйте добавить это ко всем вашим контроллерам, которым необходимо поддерживать iPhone 5:

- (void) loadView
{
    [super loadView];
    self.view.frame = [UIScreen mainScreen].bounds;
}

Ответ 3

Просто установите размер представления в None с помощью Interface-builder
Он будет иметь размер просмотров во время выполнения, просто вам нужно позаботиться о происхождении и автосоздании для каждого элемента (UILabel, UIImage и т.д.) В представлении.

  • Interface-builder (XIB) → Attribute Inspector → Имитированные показатели - Размер: Нет

enter image description here

Ответ 4

Я боролся с этим сегодня, и независимо от того, что я делал, мои взгляды всегда показывались как 320x480, даже при работе на симуляторе сетчатки 4. Даже [UIScreen mainScreen].bounds возвращал 320x480!

Я обнаружил, что добавление образа запуска [email protected] стало ключом к тому, чтобы iOS распознал мое приложение как "готовое Retina 4". Как только я это сделал, я обнаружил, что не должен был ничего делать, чтобы получить nibs для автоматического размера без черных полосок Нет необходимости иметь два отдельных xibs, изменять настройки в Interface Builder, переопределять loadView и т.д.

Ответ 5

Вам не нужно использовать другой наконечник для 3,5-дюймовых и 4-дюймовых устройств. Создайте приложение для 4-дюймового устройства и правильно настройте AutoResizingMask, и он должен работать правильно.

В вашем случае просто установите для параметра AutoResizingMask значение

[view setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];

Маска авторезистировки правильно помещает представление в свое положение на обоих устройствах.

Ответ 6

Если вы решите использовать 2 xib файла; в вашем методе initWithNibName() просто сделайте вызов super с другим именем nib.

Я бы тестировал оригинальное измерение 480 высоты, а не на высоте 568, чтобы увеличить размер файла xib, когда Apple выпустит более крупный экран. В будущем, по крайней мере, более крупный xib не будет помещен в буклете размером с меньший.

// From MainView.m
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
        self = [super initWithNibName:@"MainView" bundle:nibBundleOrNil];
    }
    else
    {
        // iPhone 5 or maybe a larger iPhone ??
        self = [super initWithNibName:@"MainView5" bundle:nibBundleOrNil];
    }

    return self;
}

Ответ 7

У меня есть идея. Отделите свой пользовательский интерфейс на заголовок, тело и нижний колонтитул (например, на веб-сайте). Затем в консоли вашего кода найдите в "Инспекторе размеров" и используйте автосоздание.

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

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

Ответ 8

Определите условие ниже строки и проверки на основе устройства.

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) 
if (IS_IPHONE_5) {
    btnBookmark.frame=CGRectMake(0, 460, 100, 70);
    btnBookmark.frame=CGRectMake(150, 460, 100, 70);
}
else {
    btnBookmark.frame=CGRectMake(0, 360, 100, 70);
    btnBookmark.frame=CGRectMake(150, 360, 100, 70);
}

Ответ 9

У меня возникла проблема с 3.5 "против 4", и я неправильно понял, что было не так, поэтому я хотел документировать его здесь, если он помогает кому-либо.

Если вы пытаетесь получить доступ к self.view.frame, это будет сообщено неправильно до viewDidAppear или какого-либо подобного события. Если вы попытаетесь получить доступ к self.view.frame из viewDidLoad, то вы можете сообщить о размерах кадра перед тем, как произойдет автоматизация.

Ответ 10

Без использования автозапуска вам может потребоваться обработать много вещей в коде. Я предполагаю, что большая часть вашего макета может хорошо работать с пружинами и распорками, но некоторые элементы пользовательского интерфейса не могут просто вручную устанавливать рамки определенных объектов в соответствии с размером вашего вида.

Ответ 11

  • В своем раскадровке нажмите "Показать инспектор файлов".
  • В документе "Конструктор интерфейса" → "Управление версиями документов" выберите "Развертывание = iOS 5" (или ваш выбор).

Если это не сработает, вам нужно работать с каждым вашим видом. Выберите их. В разделе "Инспектор атрибутов" для каждого из них в разделе "Вид" см. "Атрибут режима". Установите для этого значение "Перерисовать".

Если даже это не дает удовлетворительного результата, установите размер представления наименьшей из всех версий, которые вы собираетесь использовать. И установите атрибут Mode = 'Scale для заполнения'.

Программно, атрибут режима свойство view.contentmode.

Ответ 12

ivanzoid сниппета над этими запросами для всего размера экрана делает трюк, пока вы помните, чтобы вычесть смещения для навигации и панелей инструментов (всего 64 в большинстве условий).

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

Повторное тестирование моего приложения на iPhone 5 Мне нужно было сделать это только на одном экране с некоторыми настройками позиции управления временем выполнения. Каждый другой случай обрабатывается по умолчанию по умолчанию XIB.

Ответ 13

Если вы не хотите использовать два xib и заинтересованы в использовании Autosizing здесь

Ответ 14

Если ваш пользовательский интерфейс слишком сложный и содержит слишком много UIControl, то я предлагаю сделать следующее в viewDidLoad():

NSLog(@"Iphone %f ",[[UIScreen mainScreen] bounds].size.height);
if ([[UIScreen mainScreen] bounds].size.height == 568) 
{
     //design frames of your controls accordingly add add the controls as subview to
     self.view            
     //this is iphone 5 xib
} else 
{
     //design frames of your controls accordingly add add the controls as subview to
     self.view 
     // this is iphone 4 xib
}