UINavigationBar
не предоставляет нам механизм Autolayout должным образом.
Отчасти потому, что он только начал поддерживать Autolayout с iOS 11!
Ознакомьтесь с этой суть от Yoshimasa Niwa для получения дополнительной информации:
UINavigationBar
использовал раскладку вручную до iOS 10, поэтому все его представления содержимого, такие как titleView
, были непосредственно дочерними представлениями UINavigationBar
.Тем не менее, начиная с iOS 11, она использует автоматическую разметку с набором направляющих для разметки своих представлений содержимого в своем собственном внутреннем представлении контейнера, _UINavigationBarContentView
.
В общем, чтобы поместитьограничения позиционирования на любом view
, нам нужна ссылка на его superview
или на одноуровневое представление.
someView.leadingAnchor.constraint(equalTo: superView.leadingAnchor)
someView.trailingAnchor.constraint(equalTo: superView.trailingAnchor)
Аналогично, в случае UINavigationBar
нам нужна ссылка на *Суперпредставление 1025 *, которое _UINavigationBarContentView
.
Практически, мы могли бы пройти self.navigationController?.navigationBar.subviews
, чтобы получить _UINavigationBarContentView
, чтобы применить целую группу якорей к titleView
, но так как _UINavigationBarContentView
являетсяprivate, на него вообще не следует ссылаться.
Кто знает, изменится ли иерархия в будущих выпусках iOS, или, может быть, они поменяют имя, или не знаю, как они изменятся.
Итог: мне это просто кажетсяпрямо сейчас, что нет безопасного способа применить правильные ограничения на ведение / трейлинг / верх / низ / и т.д. на titleView
. *
* Исправьте меня, если я ошибаюсь
Предложение:
Однако, если ваш urlTextField
был сам titleView
вместоbarView
то есть что-то вроде:
Вы можете спокойно обойтись с:
urlTextField.translatesAutoresizingMaskIntoConstraints = false
urlTextField.widthAnchor.constraint(equalToConstant: self.view.frame.size.width - 16).isActive = true
urlTextField.layoutIfNeeded()
Чтобы увидеть это: