Безопасная зона и панель навигации

Я пытаюсь добавить панель навигации в xib, но панель навигации не заполняется до верха, она оставляет пространство над ней, где находится выемка камеры. Смотрите скриншот ниже:

Вот мои ограничения для панели навигации:

Я также попытался установить верхнее ограничение для панели навигации на Superview. Это результат этого:

Я не могу поверить, что это так сложно. Что мне здесь не хватает?

4 ответа

  1. У вас должен быть @IBOutlet вашей панели навигации (или ссылка, если панель навигации сделана программно). Кроме того, оставьте верхнее ограничение панели Safe area.
  2. Сделайте свой ViewController соответствующим UINavigationBarDelegate и установите делегата панели навигации (navigationBar.delegate = self)
  3. Реализуйте эту функцию и верните.topAttached:

func position(for bar: UIBarPositioning) -> UIBarPosition { return .topAttached }

Вы почти никогда не хотите добавлять UINavigationBar непосредственно к контроллеру представления viewСкорее вы хотите встроить свой контроллер представления в UINavigationController, Если вы используете раскадровки, вы можете сделать это, выбрав контроллер представления, щелкнув меню "Редактор" -> "Встроить" -> "Контроллер навигации".

Если раскадровки не используются, вы можете создать контроллер представления и установить его в качестве корневого контроллера представления UINavigationController, Затем представьте контроллер навигации или вставьте этот контроллер навигации в контроллер вкладок или разделенный контроллер.

let mySpecialViewController = MySpecialViewController()
let navigationController = UINavigationController(rootViewController: mySpecialViewController)
present(navigationController, animated: true)

Этот код выше должен вызываться изнутри UIViewController подкласс.

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

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let mySpecialViewController = MySpecialViewController()
    let navigationController = UINavigationController(rootViewController: mySpecialViewController)
    window?.rootViewController = navigationController
    window?.makeKeyAndVisible()
    return true
}

Была такая же проблема, и я смог найти решение. Что вам нужно сделать, так это установить делегата, реализовать positionForBar: в делегате, возвращающем UIBarPositionTopAttached

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar
{
    return UIBarPositionTopAttached;
}

Пытаетесь использовать навигационную панель не в навигационном контроллере?

Изображение моего расширенного навигационного хака (выделено синим цветом для видимости)

После создания моей панели навигации сообщений с этим:

      let navBar = UINavigationBar(frame: CGRect(x: 0, y: 44.0, width: UIScreen.main.bounds.width, height: 55.0))
self.view.addSubview(navBar)
navBar.items?.append(UINavigationItem(title: "title"))
if #available(iOS 13.0, *) {
    let navBarAppearance = UINavigationBarAppearance()
    navBarAppearance.configureWithOpaqueBackground()
    navBarAppearance.backgroundColor = UIColor.white
    navBar.standardAppearance = navBarAppearance
    navBar.scrollEdgeAppearance = navBarAppearance
} else {
    //ConvoViewController.edgesForExtendedLayout = []
}

Я сталкивался с проблемой, когда пользователь мог прокручивать вверх и видеть сообщения над панелью навигации, наложенные на сигнал времени/батареи/Wi-Fi, что делало очень плохой пользовательский интерфейс.

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

      let navBar = UINavigationBar(frame: CGRect(x: 0, y: 44.0, width: UIScreen.main.bounds.width, height: 55.0))
var textView = UITextView(frame: CGRect(x: 0, y: 0.0, width: UIScreen.main.bounds.width, height: 55.0))
textView.backgroundColor = UIColor.blue
self.view.addSubview(textView)
self.view.addSubview(navBar)
navBar.items?.append(UINavigationItem(title: "title"))
if #available(iOS 13.0, *) {
    let navBarAppearance = UINavigationBarAppearance()
    navBarAppearance.configureWithOpaqueBackground()
    navBarAppearance.backgroundColor = UIColor.white
    navBar.standardAppearance = navBarAppearance
    navBar.scrollEdgeAppearance = navBarAppearance
} else {
    //ConvoViewController.edgesForExtendedLayout = []
}
Другие вопросы по тегам