Как установить текстовое поле на всю ширину родительского просмотра в панели навигатора - PullRequest
0 голосов
/ 30 мая 2018

Я новичок в разработке для iOS и пытаюсь разработать браузер, который будет выглядеть ниже.

enter image description here

Я устанавливаю ширину и высоту Bar View в коде.Это отлично работает.

enter image description here

А затем добавьте ограничения Url Text Field в pin

enter image description here

Ширина не ограничена родительским контейнером barView (который является полной шириной)

enter image description here

Интересноесть что-то особенное ширины текстового поля?Я копаюсь, но не нашел ответа.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

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 то есть что-то вроде:

TextField as TitleView

Вы можете спокойно обойтись с:

urlTextField.translatesAutoresizingMaskIntoConstraints = false
urlTextField.widthAnchor.constraint(equalToConstant: self.view.frame.size.width - 16).isActive = true
urlTextField.layoutIfNeeded()

Чтобы увидеть это:

Simulator Output

0 голосов
/ 30 мая 2018

Чтобы установить UITextField на UINavigationBar с полной шириной, используйте следующий код:

создайте переменную UITextField с фиксированным Rect, рассчитанным по размеру экрана.Вы можете изменить в зависимости от ваших требований.

   lazy   var navTxtField:UITextField = UITextField(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 40))

По вашему мнениюWillAppear

    navTxtField.placeholder = "Search here..."
    navTxtField.text = ""
    self.navTxtField.addTarget(self, action: #selector(self.textDidChangeText(_:)), for: .editingChanged) // if you need to identify text changes in textfield measn you can use this otherwise ignore this

    let leftNavBarButton = UIBarButtonItem(customView: navTxtField) 
    self.navigationItem.leftBarButtonItems?.append(leftNavBarButton)

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...