Ширина UITextField в зависимости от его заполнителя - swift - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь создать приложение, аутентификация которого основана на номере телефона пользователя.

Итак, я собираюсь реализовать 2 поля UITextField, первый текст которого отображает местозаполнитель национального кода страны, например, "+855", "+611" как то так.И второй textField будет принимать phoneNumber пользователя.

Итак, мой вопрос заключается в том, что для моего первого textField, который я поместил в качестве местозаполнителя телефонного кода пользователя, вроде textField.placeholder = "+855".Поэтому, когда я устанавливаю ограничение программно (я не использую раскадровку моего приложения) UITextField, я хочу, чтобы его ширина равнялась заполнителю.

Как мне добиться чего-то подобного?

1 Ответ

0 голосов
/ 10 декабря 2018

Это может работать на вас.Появляется при быстром тестировании ...

Когда вы создаете / добавляете текстовое поле, также создайте ограничение widthAnchor - не имеет значения, какую константу вы ему дадите, потому что оно будет изменено в viewDidLayoutSubviews().

Затем в viewDidLayoutSubviews() получите прямоугольник текста заполнителя с помощью let r = theTextField.placeholderRect(forBounds: theTextField.bounds) и установите для константы widthAnchor ширину (плюс отступ) этого прямоугольника:

class ViewController: UIViewController {

    var theTextField: UITextField = {
        let v = UITextField()
        v.placeholder = "+855"
        v.font = UIFont.systemFont(ofSize: 20.0)
        v.backgroundColor = .white
        v.borderStyle = .roundedRect
        v.translatesAutoresizingMaskIntoConstraints = false
        return v
    }()

    var theTFWidthAnchor: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(theTextField)

        NSLayoutConstraint.activate([
            theTextField.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 80.0),
            theTextField.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0.0),
            ])

        // initialize the widthAnchor, but don't set it to Active           
        theTFWidthAnchor = theTextField.widthAnchor.constraint(equalToConstant: 100)

    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        // get the rect of the placeholder text
        let r = theTextField.placeholderRect(forBounds: theTextField.bounds)
        // set the widthAnchor constant equal to the placeHolder
        // width + origin.x * 2 (handles padding with roundedRect style)
        theTFWidthAnchor.constant = r.width + r.origin.x * 2
        theTFWidthAnchor.isActive = true

    }

}
...