Пользовательский навигатор ios 11 переходит в строку состояния

просто скачал xcode 9, и у меня возникла эта странная проблема, на ios 11 мой пользовательский навигатор, по-видимому, имеет половину размера и находится в строке состояния, на ios 10 отлично работает.

так вот мой код

let newNavbar: UINavigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 64))
let navItem = UINavigationItem()

//create and assign the items

newNavbar.setItems([navItem], animated: false)
view.addSubview(newNavbar)

вот скриншот, ios11 слева и ios10 справа,

введите описание изображения здесь

Ответ 1

Ваш код всегда был неправильным. Вы не должны устанавливать высоту вручную добавленной панели навигации или размещать ее в верхней части окна. Вы должны прикрепить верхнюю часть панели навигации к нижней части строки состояния (например, к верхней части безопасной области) и дать ей делегат, чтобы вы могли использовать механизм UIBarPositionDelegate, чтобы установить его положение на .topAttached, что приведет к правильно растянуть до верхней части экрана.

(Но вы также должны спросить себя, почему вы добавляете панель навигации вручную. Обычно нет причин не оборачивать свой контроллер представления в UINavigationController - даже если вы не собираетесь делать какую-либо реальную навигацию - просто чтобы получить навигацию панель со всем ее автоматическим управлением.)

Ответ 2

См. пользовательскую панель навигации ios 11, которая находится под строкой состояния/панель навигации ios 11 перекрывает строку состояния, чтобы найти ответ

Не уверен, что это та же проблема, но мы столкнулись с этим и при обновлении до iOS 11.

См. пользовательская панель навигации ios 11, которая находится под строкой состояния

.Мы вручную устанавливали высоту навигационной панели на 64 и прикрепляли к краям суперпредставления. Соответствие протоколу UINavigationBarDelegate и реализация метода делегата UIBarPositionDelegate решили эту проблему за нас.

Мы заменили

navigationBar.autoPinEdgesToSuperviewEdgesExcludingEdge(.bottom)
navigationBar.autoSetDimension(.height, toSize: 64)

с

...
  if #available(iOS 11.0, *) {
    navigationBar.topAnchor.constraint(
      equalTo: self.view.safeAreaLayoutGuide.topAnchor
    ).isActive = true
  } else {
    navigationBar.topAnchor.constraint(
      equalTo: topLayoutGuide.bottomAnchor
    ).isActive = true
  }
  navigationBar.autoPinEdge(toSuperviewEdge: .left)
  navigationBar.autoPinEdge(toSuperviewEdge: .right)
  navigationBar.delegate = self
...

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

При этом используется DSL purelayout для некоторых вызовов автоматического размещения (https://github.com/PureLayout/PureLayout)

Кредит идет на https://stackoverflow.com/users/341994/matt для ответа

Ответ 3

Попробуйте добавить некоторые ограничения автоматической компоновки после добавления навигационной панели в представление

if #available(iOS 11.0, *) {
    newNavbar.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    newNavbar.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    newNavbar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
    newNavbar.heightAnchor.constraint(equalToConstant: 64).isActive = true
}

Фактически вы можете использовать все, кроме третьего ограничения, в более ранних версиях iOS, но если все это работает в более ранних версиях, вы можете не захотеть с ним столкнуться.

Использование безопасной области макета должно содержать панель навигации в строке состояния.

Ответ 4

Прежде всего, убедитесь, что ваш навигационный контроллер "показывает навигационную панель" не установлен в раскадровке.

Затем перетащите панель навигации из "библиотеки объектов". Дайте ограничение сверху равным 20.

Он также отлично работает в "симуляторе iPhone X".

Счастливое кодирование!

Ответ 5

Пробовал это решение в Swift 4.1

let menuBar: UIView = {
let mb = UIView()
mb.backgroundColor = .red
mb.translatesAutoresizingMaskIntoConstraints = false
return mb
}()



private func setupMenuBar(){

view.addSubview(menuBar)

let constraints = [ menuBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
                    menuBar.leadingAnchor.constraint(equalTo: view.leadingAnchor),
                    menuBar.trailingAnchor.constraint(equalTo: view.trailingAnchor),
                    menuBar.heightAnchor.constraint(equalToConstant: 50)]
NSLayoutConstraint.activate(constraints)
}

Ответ 6

Это работало для меня, хотя оно имеет дело с панелью поиска: fooobar.com/info/632378/...