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

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

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

existing nav

Требования:

  • Новый вид должен выглядеть "модально", т.е. мне нужен presentViewController.

  • Отобразите какую-нибудь навигационную панель или панель инструментов, при этом строка состояния примет цвет фона стиля навигационной панели ala iOS 7.

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

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

Параметры:

A. Сдвиньте свой ракурс вниз.

Ugh, вернемся ли мы к pre-iOS 5 дням и сбрасываем фреймы? Также, как правило, не рекомендуется смешивать с автозапуском.

В. Добавьте немного вверху вверх под панелью навигации.

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

nav with gap

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

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

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

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

enter image description here

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

Несколько недостатков: вы будете жестко кодировать дельта ios6/7. Также не работает с автозагрузкой.

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

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

uinavcontroller workaround

4b9b3361

Ответ 1

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

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

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

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

Недостатки:

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

Ответ 2

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

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

enter image description here

Ответ 3

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

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

Ответ 4

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