iOS 7 | Кнопки панели навигации / панели инструментов расположены очень близко к строке состояния

У меня проблема при перетаскивании навигационной панели или панели инструментов (раскадровки) на мой контроллер представления.

UINavigationBar:

UINavigationBar

Как вы можете видеть на изображении выше, правая кнопка почти перекрывает строку состояния.

С UIToolbar это происходит так же:

UIToolbar

Контроллеры этого представления предназначены для использования в качестве модальных, поэтому я не использую UINavigationController.

В другом разделе я использую 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, следует ли расширять фон в верхней части строки состояния.

Пожалуйста, смотрите мой ответ здесь, я скопировал содержание ниже для удобства:

/questions/26252970/kak-predstavit-kontroller-predstavleniya-na-ios7-bez-perekryitiya-stroki-sostoyaniya/26252973#26252973

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

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)

Другие вопросы по тегам