动态更改UITextField宽度取决于内容

时间:2016-05-20 20:19:21

标签: ios swift uitextfield

我遇到与此相同的问题:Resize a UITextField while typing (by using Autolayout)

但它已通过UITextView解决,而不是UITextField

此代码无效:

func textFieldDidChange(sender: UITextField) {
    sender.invalidateIntrinsicContentSize()
}

我有UITextField(红色背景)并在StackView中使用AutoLayout:

enter image description here

和约束:

enter image description here

UITextField仅在resignFirstResponder时更改宽度。 请问关于这个问题的任何建议吗? 我是Swift和iOS开发的新手。

3 个答案:

答案 0 :(得分:2)

UITextField在更改内容时不会调用您的方法textFieldDidChange(_:)(它不属于UITextFieldDelegate)。您应该使用textField(_:shouldChangeCharactersInRange:replacementString:)代替。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    textField.invalidateIntrinsicContentSize()
    return true
}

答案 1 :(得分:1)

要使用Autolayout执行此操作,您需要对文本字段的宽度进行约束。然后,当文本更改时,计算所需的宽度并将约束上的constant属性设置为该值。最后,您需要在父视图上调用layoutIfNeeded()

答案 2 :(得分:1)

这适用于UITextField。 在我的情况下,我希望字体大小相同。我将textField宽度约束设置为> = 10,它在iOS 9,10,11上工作正常。

对于iOS 11,这甚至可以在编辑文本时使用。

要在iOS 9和10上编辑文本时使其工作,我通过注册textDidChange事件来处理另一个方法。

//Swift 3 Sample

//In viewDidLoad
adjustableTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)


 @objc func textFieldDidChange(_ textField: UITextField) {
    adjustableTextField.resignFirstResponder()
    adjustableTextField.becomeFirstResponder()
}