iOS 7 | Кнопки панели навигации / панели инструментов расположены очень близко к строке состояния
У меня проблема при перетаскивании навигационной панели или панели инструментов (раскадровки) на мой контроллер представления.
UINavigationBar:
Как вы можете видеть на изображении выше, правая кнопка почти перекрывает строку состояния.
С UIToolbar это происходит так же:
Контроллеры этого представления предназначены для использования в качестве модальных, поэтому я не использую UINavigationController.
В другом разделе я использую UINavigationController, и он выглядит так, как я ожидаю:
Как я могу перетащить UINavigationBar / UIToolbar в контроллер представления, не перекрывая строку состояния?
6 ответов
Панели навигации или панели инструментов должны быть в (0, viewController.topLayoutGuide.length
) с позиционированием UIBarPositionTopAttached
, Вы должны установить делегат вашей панели навигации или панели инструментов для вашего контроллера представления и вернуть UIBarPositionTopAttached
, При правильном расположении вы получите результат в своем третьем изображении.
Более подробная информация здесь: https://developer.apple.com/documentation/uikit/uibarpositioningdelegate?language=objc
Сделать эти шаги
Перетащите панель навигации на свой ViewController в Xib, установите ViewController в качестве его делегата. Обратите внимание, что NavigationBar должен быть в (0, 20)
В ViewController, соответствуют UINavigationBarDelegate
@interface ETPViewController () <UINavigationBarDelegate>
Реализуйте этот метод
- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar
{
return UIBarPositionTopAttached;
}
positionForBar сообщает NavigationBar, следует ли расширять фон в верхней части строки состояния.
Пожалуйста, смотрите мой ответ здесь, я скопировал содержание ниже для удобства:
Самый простой обходной путь, который я нашел, - это обернуть контроллер представления, который вы хотите представить, в контроллер навигации, а затем представить этот контроллер навигации.
MyViewController *vc = [MyViewController new];
UINavigationController *nav = [[UINavigationController alloc]
initWithRootViewController:vc];
[self presentViewController:nav animated:YES completion:NULL];
Преимущества:
- Не надо гадить с фреймами.
- Тот же код работает на iOS 6 и iOS 7.
- Менее уродлив, чем другие обходные пути.
Недостатки:
- Возможно, вы захотите оставить свой XIB пустым из панелей навигации или панелей инструментов и программно добавить UIBarButtonItems в панель навигации. К счастью, это довольно просто.
Вы можете решить эту проблему, используя Auto Layout, согласно этой технической заметке ( Запрет панели состояния скрывать ваши представления).
Вот некоторые выдержки:
Добавьте ограничение вертикального пространства на самый верхний вид
- Перетащите элемент управления с панели инструментов UITool в "Top Layout Guide"
- Во всплывающем окне выберите "Вертикальный интервал"
- Измените константу "вертикальное пространство" на 0 (ноль)
Если у вас есть другие подпредставления под панелью инструментов UITool, прикрепите эти представления к панели инструментов вместо руководства по верхнему макету
Это будет поддерживать ios6 и ios7.
Вы также можете управлять им, увеличив высоту панели навигации, предоставив изображение размером 620x128 для версии ios. И это изображение используется в:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)?YES:NO) {
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"newImage.png"] forBarMetrics:UIBarMetricsDefault];
}else{
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"previousImage.png"] forBarMetrics:UIBarMetricsDefault];
}
Я сдался и должен был установить ограничение высоты навигационной панели на 64 в x xib на основе VC, так как viewController.topLayoutGuide.length равен 0 в viewDidLoad, несмотря на наличие строки состояния:-[что означает, что в неуниверсальном приложении на ipad у вас будет 20 px в верхней части представления потрачено впустую (строка состояния причины отделена от окна симуляции iphone)