Ширина UITextField в зависимости от его заполнителя - swift

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

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

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

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


person Visal Sambo    schedule 08.12.2018    source источник
comment
Это поможет вам https://stackoverflow.com/questions/33805900/uitextfield-placeholder-text-adjust-to-fit/40945093   -  person B K.    schedule 08.12.2018


Ответы (1)


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

Когда вы создаете / добавляете текстовое поле, также создайте ограничение 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

    }

}
person DonMag    schedule 10.12.2018