我遇到与此相同的问题:Resize a UITextField while typing (by using Autolayout)
但它已通过UITextView
解决,而不是UITextField
。
此代码无效:
func textFieldDidChange(sender: UITextField) {
sender.invalidateIntrinsicContentSize()
}
我有UITextField
(红色背景)并在StackView中使用AutoLayout:
和约束:
但UITextField
仅在resignFirstResponder
时更改宽度。
请问关于这个问题的任何建议吗?
我是Swift和iOS开发的新手。
答案 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()
}