IOS 7 | Панель навигации/кнопки панели инструментов очень близко к строке состояния
У меня проблема при перетаскивании панели навигации или панели инструментов (раскадровки) в контроллер моего представления.
UINavigationBar:
![UINavigationBar]()
Как вы можете видеть на изображении выше, правая кнопка почти перекрывает строку состояния.
С UIToolbar происходит одно и то же:
![UIToolbar]()
Эти контроллеры представлений предназначены для использования в качестве Модаля, поэтому я не использую UINavigationController.
В другом разделе я использую UINavigationController, и он выглядит так, как я ожидаю:
![UINavigationController]()
Как перетащить UINavigationBar/UIToolbar в контроллер вида без перекрытия строки состояния?
Ответы
Ответ 1
Навигационные панели или панели инструментов должны быть в состоянии (0, viewController.topLayoutGuide.length
) с позиционированием панели UIBarPositionTopAttached
. Вы должны установить делегат вашей панели навигации или панели инструментов в свой контроллер просмотра и вернуть UIBarPositionTopAttached
. Если позиционировать правильно, вы получите результат в своем третьем изображении.
Дополнительная информация здесь:
https://developer.apple.com/documentation/uikit/uibarpositioningdelegate?language=objc
Ответ 2
Сделайте следующие шаги
Перетащите навигационную панель в ViewController в Xib, установите ViewController в качестве своего делегата.
Обратите внимание, что NavigationBar должен быть в (0, 20)
В ViewController совместим с UINavigationBarDelegate
@interface ETPViewController () <UINavigationBarDelegate>
Внедрить этот метод
- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar
{
return UIBarPositionTopAttached;
}
positionForBar сообщает навигационной панели, если она должна увеличивать свой фон вверх по строке состояния
Ответ 3
Пожалуйста, см. мой ответ здесь, я скопировал содержание ниже для удобства:
fooobar.com/questions/85428/...
Самое легкое обходное решение, которое я нашел, - это обернуть контроллер представления, который вы хотите представить в контроллере навигации, а затем представить этот контроллер навигации.
MyViewController *vc = [MyViewController new];
UINavigationController *nav = [[UINavigationController alloc]
initWithRootViewController:vc];
[self presentViewController:nav animated:YES completion:NULL];
Преимущества:
- Нет необходимости в настройке фреймов.
- Тот же код работает на iOS 6 и iOS 7.
- Менее уродливые, чем другие обходные пути.
Недостатки:
- Вероятно, вы захотите оставить свой XIB пустым в навигационных барах или панелях инструментов и программно добавить UIBarButtonItems в панель навигации. К счастью, это довольно легко.
Ответ 4
Вы можете решить эту проблему, используя автоматическую компоновку, в соответствии с этой технической запиской (Предотвращение отображения строки состояния из ваших просмотров).
Вот несколько выдержек:
Добавьте вертикальное ограничение пространства в самый верхний вид
- Управляйте перетаскиванием из UIToolbar в "Руководство по верхнему макету"
- В popover выберите "Вертикальный интервал"
- Измените константу "Вертикальное пространственное ограничение" на 0 (ноль)
Если у вас есть другие подпункты ниже UIToolbar, привяжите эти представления к панель инструментов вместо верхнего руководства по макету
Это будет поддерживать ios6 и ios7.
Ответ 5
Вы также можете управлять им, увеличивая высоту панели навигации, предоставляя изображение размером 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];
}
Ответ 6
Я сдался и должен был установить ограничение высоты навигатора на 64 в xCB на основе VC. viewController.topLayoutGuide.length равен 0 в viewDidLoad, несмотря на наличие строки состояния: - [
что означает, что в не универсальном приложении на ipad у вас должно быть 20 пикселей в верхней части
(в строке состояния отдельно от окна моделирования iphone)