UITextField基于其占位符的宽度-Swift

时间:2018-12-08 03:25:32

标签: ios swift uitextfield nslayoutconstraint

我试图构建一个基于用户电话号码进行身份验证的应用程序。

因此,我将实现2个UITextField,其中第一个textField将显示为用户国家电话国家/地区代码的占位符,例如示例“ +855”,“ + 611”。第二个textField将使用用户的phoneNumber。

因此,我的问题是,对于我的第一个textField,我将其放在用户电话国家/地区代码(例如textField.placeholder = "+855")的占位符中。因此,当我以编程方式(不使用我的应用的故事板)设置约束UITextField时,我希望其宽度应等于其占位符。

我如何实现这样的目标?

1 个答案:

答案 0 :(得分: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

    }

}