Как представить контроллер представления на 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.
Это обходной путь, который я выбрал. Смотрите ответ ниже.
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. на вкладке инспектора выберите атрибуты и выберите в верхней панели "Непрозрачная панель навигации". это решило проблему для меня.