iOS 6/7 Deltas: работает только для подвидов?

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

Тем не менее, во многих сообщениях на Stackoverflow предлагается использовать Delta для iOS 6/7, которые можно установить в Xcode с помощью нового SDK:

iOS 6/7 Deltas в Xcode

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

Почему дельты не работают для корневого представления? Есть ли способ заставить его работать? (Я не хочу добавлять дельты ко всем элементам пользовательского интерфейса во всех моих контроллерах представления.)


person Mischa    schedule 01.10.2013    source источник
comment
Это спецификация ios7 для использования в полноэкранном режиме, поэтому корневой вид всегда будет оставаться в полноэкранном режиме. Итак, вы должны поставить дельты на все компоненты. или вы можете сделать это - добавьте одно новое представление с дельтой, поместите в него все остальные компоненты и поместите их представление в свой rootView   -  person Mehul Thakkar    schedule 09.10.2013


Ответы (5)


Я нашел эту работу, которая отлично работает для меня.

 -(void)viewWillLayoutSubviews
{
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) 
   {
    // Load resources for iOS 6.1 or earlier
    if(IS_IPhone5)
    {
        self.view.frame = CGRectMake(0.0, -64.0, 320.0, 568.0);
    }
    else
    {
      self.view.frame = CGRectMake(0.0, -64.0, 320.0, 480.0);  
     }
   }

 }
person bhavya kothari    schedule 30.01.2014

Из вашего вопроса Что я думаю, вы устали от установки дельта-значений для отдельных подпредставлений. Но это очень легко, я думаю. Просто выберите все подвиды:

введите здесь описание изображения

и вы можете добавить одинаковые значения дельты для всех ваших подпредставлений из инспектора размеров за один раз... так просто!!

введите здесь описание изображения

person Ajay    schedule 30.01.2014

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

Установите просмотр как iOS 7 для целевого xib в инспекторе файлов.

1. Поместите все ваши представления в представление контейнера, которое будет иметь рамку (0,20, rootViewWidth, rootViewHeight), используя Interface Builder. Примечание. Нет необходимости задавать дельту для любого из представлений внутри представления контейнера. Дельта для представления контейнера будет: delta-Y =-20, delta-height=20, иначе нуль

2. Поместите еще один вид (назовите его как statusBarBackgroudView) кадра (0,0, rootViewWidth, 20) в xib. Дельта для statusBarBackgroudView будет: delta-Y = -20, иначе ноль.

Задайте желаемый цвет bg для statusBarBackgroudView, который будет отображаться под строкой состояния в iOS 7, а в iOS 6 он просто сместится на Y = -20, поэтому не будет виден.

Иерархия представлений в XIB должна выглядеть следующим образом:

Root View
 -Container View
   -your subviews
 -Status Bar Background View
person dev gr    schedule 24.02.2014
comment
Я удивлен, что этот ответ не получил больше голосов. Хорошее ясное объяснение и использование функций Xcode так, как они были задуманы, без необходимости дополнительных операторов IF в коде. (Спасибо также за совет «Просмотреть как iOS7» — это то, чего мне не хватало.) - person Erik van der Neut; 29.07.2014

Этот сегмент кода решил проблему для меня. Я поместил его в BaseViewController, который является суперклассом для всех UIViewController в проекте. Я думаю, что более целесообразно добавить этот простой код вместо изменения дельт в каждом файле xib. Получено из ответа бхавья котари:

- (void)viewWillLayoutSubviews{

    [self fixStatusBarOffsetIfiOS6];
    [super viewWillLayoutSubviews];
}

- (void)fixStatusBarOffsetIfiOS6{

    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){
        self.view.frame = CGRectMake(0.0, -20.0, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame) + 20);
    }
}
person Yunus Nedim Mehel    schedule 24.02.2014

если (IS_Ios6) {

    if (IS_IPHONE_4) {
        self.view.frame = CGRectMake(0, 0, 320, 480);
    } else if (IS_IPAD){
        self.view.frame = CGRectMake(0, 0, 768, 1024);
    }
    self.wantsFullScreenLayout = YES;
}

поместите этот код в viewDidLoad...

person JATIN    schedule 04.07.2014