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,

Другие вопросы по тегам