it-swarm.com.ru

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

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

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

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

Может кто-нибудь подсказать, как на самом деле сделать 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

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

     - (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil;
    
  2. Добавьте этот код в ваш файл .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;
      }
    
  3. Откройте файл YouProject-Prefix.pch и импортируйте свою категорию здесь 

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

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

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

\

38
Waseem Shah

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

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

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

  • Интерфейсный конструктор (XIB) -> Инспектор атрибутов -> Симулированные метрики - Размер: Нет

enter image description here

11
Navnath Godse

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

Я обнаружил, что добавление образа запуска [email protected] было ключом к тому, чтобы iOS распознала мое приложение как «retina 4« готово ». После того, как я это сделал, я обнаружил, что больше ничего не нужно делать, чтобы автоматически настроить размер перьев. без черных полос. Нет необходимости иметь два отдельных xib, изменять настройки в Интерфейсном Разработчике, переопределяя loadView и т. д.

6
Diarrhio

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

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

// 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;
}
3
Ed Trujillo

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

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

[view setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];

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

3
MaheshShanbhag

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

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

1
BigCheesy

У меня есть идея. Позвольте разделить ваш пользовательский интерфейс на верхний и нижний колонтитулы (например, веб-сайт). Затем в консоли кода найдите Size Inspector и используйте функцию автоматического изменения размера.

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

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

1
Shinigamae

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

#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);
}
1
Chris Alan

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

0
rooster117
  • В раскадровке нажмите «Показать инспектор файлов».
  • Под Интерфейсным документом документа-> Версии документа выберите Deployment = iOS 5 (или ваш выбор).

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

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

Программно атрибутом Mode является view.contentmode property.

0
Nirav Bhatt

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

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

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

0
Chris Fox

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

0
the1pawan