Как представить контроллер представления на iOS7 без перекрытия строки состояния

Я вижу, когда я перенес свое приложение на iOS 7, панель навигации отображается под строкой состояния при представлении контроллера представления. Я думаю, что многие люди столкнулись с этой же проблемой. Вот скриншот того, что я вижу:

существующая навигация

Требования:

  • Новое представление должно появиться "модально", т.е. мне нужен presentViewController.

  • Отображение какой-либо панели навигации или панели инструментов, причем строка состояния принимает цвет фона панели навигации в стиле iOS 7.

  • Он должен работать на iOS 6.

  • Я использую XIB для обработки макета, с включенным autolayout.

Опции:

A. Сдвиньте кадр вашего взгляда немного вниз.

Тьфу, мы вернулись к 5-дневным играм до iOS и играли с фреймами? Кроме того, это не очень хорошая идея, смешивать с autolayout.

Б. Добавьте небольшой промежуток вверху под панелью навигации.

Одним из недостатков опций A и B является то, что строка состояния не будет вписываться в вашу навигацию:

навигация с разрывом

C. Программно добавлять ограничения.

Основным недостатком является то, что вам придется гадать с ограничениями и вычислять высоту навигационной панели и строки состояния. Тьфу.

D. Растяните высоту панели навигации / панели инструментов, чтобы включить область строки состояния.

Выглядит хорошо на iOS 7, но ломается на iOS 6. Вам нужно программно обновить высоту панели навигации, а также убедиться, что остальная часть вашего представления обновляется соответствующим образом. Беспорядочный.

E. Беспорядок с iOS6/7 дельт в IB.

Множество недостатков: вы будете жестко программировать дельты ios6/7. Также не работает с autolayout.

F. Используйте вложенный UINavigationController.

Это обходной путь, который я выбрал. Смотрите ответ ниже.

обходной путь uinavcontroller

4 ответа

Решение

Самый простой обходной путь, который я нашел, - это обернуть контроллер представления, который вы хотите представить, в контроллер навигации, а затем представить этот контроллер навигации.

MyViewController *vc = [MyViewController new];
UINavigationController *nav = [[UINavigationController alloc] 
    initWithRootViewController:vc];
[self presentViewController:nav animated:YES completion:NULL];

Преимущества:

  • Не надо гадить с фреймами.
  • Тот же код работает на iOS 6 и iOS 7.
  • Менее уродлив, чем другие обходные пути.

Недостатки:

  • Возможно, вы захотите оставить свой XIB пустым из панелей навигации или панелей инструментов и программно добавить UIBarButtonItems в панель навигации. К счастью, это довольно просто.

Вам нужно добавить вертикальное ограничение из вашего верхнего вида в Top Layout Guide, как описано в следующей статье Apple.

https://developer.apple.com/library/ios/qa/qa1797/_index.html

Следующий код работал для меня. Просто поместите его в контроллер, который представляет новый контроллер.

#pragma mark hidden status bar
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}

Откройте ваш файл xib и выберите viewcontroller. на вкладке инспектора выберите атрибуты и выберите в верхней панели "Непрозрачная панель навигации". это решило проблему для меня.

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