Как сделать так, чтобы панель навигации соответствовала безопасной зоне?

Я перехожу с экрана без панели навигации на экран с полосой навигации. При переходе к экрану панели навигации эта панель не входит в какие-либо ограничения безопасной области и перекрывается со строкой состояния на iPhone X. Я искал решение, но у меня ничего не работало. Как сделать так, чтобы панель навигации соответствовала указаниям по безопасной зоне на iPhone X, чтобы она не перекрывалась? кроме того, его высота кажется слишком короткой, но я думаю, что это можно решить с помощью ограничений.

Заранее спасибо!

AppDelegate:

var window: UIWindow?
var navigationController: UINavigationController?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    window = UIWindow(frame: UIScreen.main.bounds)

    if let window = window{
        let mainVC = ViewController()
        navigationController = UINavigationController(rootViewController: mainVC)
        window.rootViewController = navigationController
        window.makeKeyAndVisible()
    }
    return true
}

Это метод, который я использую для перехода от ViewController к AboutViewController:

    @objc private func infoButtonTap(){
    let aboutVC = AboutViewController()
    self.navigationController?.pushViewController(aboutVC, animated: true)
}

Обновлено: Вот как это выглядит: https://imgur.com/syuQaUn

О VC:

эта строка находится в viewDidLoad:

        navigationController?.isNavigationBarHidden = false

чтобы сделать панель навигации видимой.

Не обращайте внимания на этот комментарий, если проблема решена. Можете ли вы подтвердить, что используете только navigationBar, связанный с navigationController, для отображения? Или существует ли какая-либо другая настраиваемая панель навигации, которая используется в вашем классе О ViewController или построителе интерфейса? Потому что в остальном все выглядит хорошо и не должно вызывать этой проблемы.

D V 17.10.2018 16:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
3 783
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Встраивайте контроллер представления в контроллер навигации, а не добавляйте панель навигации вручную. Выберите контроллер представления в раскадровке и следуйте инструкциям на прилагаемом снимке экрана.

Редактор -> Вставить -> Контроллер навигации

Спасибо, я забыл упомянуть, что не использую раскадровку. должен был упомянуть, извините, сейчас я редактирую OP.

John Doah 09.10.2018 19:34

О верно. Не стоит беспокоиться. Извините, я не знаю, как это сделать без раскадровки.

Marwan 09.10.2018 19:37

Все в вашем образце выглядит правильно. Я предполагаю, что есть некоторые манипуляции с кадрами, происходящие либо в ViewController, либо в AboutViewController. Посмотрите, когда window.rootViewController меняет его на frame или bounds, чтобы отладить, что происходит.

Панель навигации скрыта в ViewController, и я хочу показать ее с помощью кнопки «Назад» в AboutViewController, поэтому я предполагаю, что она меняется в AboutViewController. Как я могу изменить его в соответствии с руководством по безопасной зоне?

John Doah 12.10.2018 14:45

@JohnDoah Если вы не хотите выглядеть как контроллер навигации, почему бы не использовать модальный контроллер представления для представления About вместо контроллера навигации?

Jeffery Thomas 12.10.2018 15:02

@JohnDoah Не могли бы вы опубликовать код для скрытия и отображения панели навигации и / или строки состояния?

Jeffery Thomas 12.10.2018 15:04

Я разместил строку, чтобы панель была видна.

John Doah 12.10.2018 15:11
Ответ принят как подходящий

Если вы действительно хотите, чтобы ваш навигационный контроллер находился в безопасной зоне. Это одно из решений для вас.

  1. Создал UIController как самый базовый контроллер всего. Назовем его SuperParentController.

  2. Убедитесь, что SuperParentController также является родительским для вашего навигационного контроллера.

  3. Затем вы можете управлять содержимым и макетом вашего SuperParentController, чтобы убедиться, что навигационный контроллер расположен так, как вам нужно.

Мы как бы используем эту стратегию, чтобы показать универсальный баннер для нашего приложения, который можно показать в любое время.

Большое тебе спасибо

John Doah 12.10.2018 18:39

Ты герой дня :)

Raimundas Sakalauskas 10.12.2020 16:50

Я не совсем уверен, в чем проблема. Ваш скриншот относится к ландшафтному режиму. Это поведение предназначено, начиная с iOS8, для альбомной ориентации. Поскольку вы включили панель навигации через соответствующий UINavigationController и нажали следующий ViewController, вы можете продолжать работу, как есть.

UINavigationBar - 44ps, но StatusBarFrames отличаются - вы можете работать с UIApplication.shared.statusBarFrame.height, чтобы получить фактическую высоту строки состояния и добавить ее к высоте навигационной панели.

Кстати: если вы хотите уважать sareAreaLayouts для iPhone X, Xs и Xr, есть подходящий NSLayout-Y/X-AxisAnchor, который удовлетворит ваши потребности.

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