topLayoutGuide перемещается после нажатия контроллера навигации
У меня есть простая иерархия контроллера представления, где один контроллер представления показан с использованием UINavigationController. В viewDidLoad
он устанавливает свои взгляды с ограничениями. Перед тем, как вид полностью виден (во время анимации), topLayoutGuide
это строка состояния, и она становится нижней частью UINavigationBar, когда вид полностью на экране. Это приводит к тому, что взгляды прыгают вокруг.
Удаление параметра "Расширить края под верхними панелями" устраняет эту проблему, но делает на панели навигации нежелательный серый градиент, который только частично исправляется при настройке панели навигации. backgroundColor
,
Есть ли способ иметь topLayoutGuide
ссылаться на нижнюю часть панели навигации даже во время анимации? Это работало прежде, но это не работает с Xcode 8.0 в iOS 10.
1 ответ
Комментируя большие куски кода, я нашел виновника в одной из функций установки, вызываемой из viewDidLoad()
, Извините, мой вопрос не содержит достаточно деталей, чтобы решить его. На случай, если кто-нибудь увидит этот симптом в будущем, вот код, воссоздающий ошибку:
override func viewDidLoad() {
super.viewDidLoad()
let label = UILabel(frame: CGRect.zero)
label.text = "Testing"
label.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(label)
self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .top, relatedBy: .equal, toItem: topLayoutGuide, attribute: .bottom, multiplier: 1, constant: 0))
self.view.layoutIfNeeded()
}
Решение состоит в том, чтобы удалить layoutIfNeeded()
вызов. Ограничения вступают в силу после viewDidLoad()
и звонит layoutIfNeeded()
внутри него временно закрутится topLayoutGuide
,