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)