Я перехожу с экрана без панели навигации на экран с полосой навигации. При переходе к экрану панели навигации эта панель не входит в какие-либо ограничения безопасной области и перекрывается со строкой состояния на 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
чтобы сделать панель навигации видимой.





Встраивайте контроллер представления в контроллер навигации, а не добавляйте панель навигации вручную. Выберите контроллер представления в раскадровке и следуйте инструкциям на прилагаемом снимке экрана.
Редактор -> Вставить -> Контроллер навигации
Спасибо, я забыл упомянуть, что не использую раскадровку. должен был упомянуть, извините, сейчас я редактирую OP.
О верно. Не стоит беспокоиться. Извините, я не знаю, как это сделать без раскадровки.
Все в вашем образце выглядит правильно. Я предполагаю, что есть некоторые манипуляции с кадрами, происходящие либо в ViewController, либо в AboutViewController. Посмотрите, когда window.rootViewController меняет его на frame или bounds, чтобы отладить, что происходит.
Панель навигации скрыта в ViewController, и я хочу показать ее с помощью кнопки «Назад» в AboutViewController, поэтому я предполагаю, что она меняется в AboutViewController. Как я могу изменить его в соответствии с руководством по безопасной зоне?
@JohnDoah Если вы не хотите выглядеть как контроллер навигации, почему бы не использовать модальный контроллер представления для представления About вместо контроллера навигации?
@JohnDoah Не могли бы вы опубликовать код для скрытия и отображения панели навигации и / или строки состояния?
Я разместил строку, чтобы панель была видна.
Если вы действительно хотите, чтобы ваш навигационный контроллер находился в безопасной зоне. Это одно из решений для вас.
Создал UIController как самый базовый контроллер всего. Назовем его SuperParentController.
Убедитесь, что SuperParentController также является родительским для вашего навигационного контроллера.
Затем вы можете управлять содержимым и макетом вашего SuperParentController, чтобы убедиться, что навигационный контроллер расположен так, как вам нужно.
Мы как бы используем эту стратегию, чтобы показать универсальный баннер для нашего приложения, который можно показать в любое время.
Большое тебе спасибо
Ты герой дня :)
Я не совсем уверен, в чем проблема. Ваш скриншот относится к ландшафтному режиму. Это поведение предназначено, начиная с iOS8, для альбомной ориентации. Поскольку вы включили панель навигации через соответствующий UINavigationController и нажали следующий ViewController, вы можете продолжать работу, как есть.
UINavigationBar - 44ps, но StatusBarFrames отличаются - вы можете работать с UIApplication.shared.statusBarFrame.height, чтобы получить фактическую высоту строки состояния и добавить ее к высоте навигационной панели.
Кстати: если вы хотите уважать sareAreaLayouts для iPhone X, Xs и Xr, есть подходящий NSLayout-Y/X-AxisAnchor, который удовлетворит ваши потребности.
Не обращайте внимания на этот комментарий, если проблема решена. Можете ли вы подтвердить, что используете только navigationBar, связанный с navigationController, для отображения? Или существует ли какая-либо другая настраиваемая панель навигации, которая используется в вашем классе О ViewController или построителе интерфейса? Потому что в остальном все выглядит хорошо и не должно вызывать этой проблемы.