我试图构建一个基于用户电话号码进行身份验证的应用程序。
因此,我将实现2个UITextField,其中第一个textField将显示为用户国家电话国家/地区代码的占位符,例如示例“ +855”,“ + 611”。第二个textField将使用用户的phoneNumber。
因此,我的问题是,对于我的第一个textField,我将其放在用户电话国家/地区代码(例如textField.placeholder = "+855"
)的占位符中。因此,当我以编程方式(不使用我的应用的故事板)设置约束UITextField
时,我希望其宽度应等于其占位符。
我如何实现这样的目标?
答案 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
}
}