Пользовательский навигатор 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/...