更改UITextField宽度dynamic取决于内容

我有同样的问题在这里: 键入时调整UITextField(通过使用Autolayout)

但它已经解决了与UITextView而不是与UITextField

这段代码没有帮助:

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

我有UITextField (红色背景),并使用StackView的AutoLayout:

在这里输入图像说明

和约束:

在这里输入图像说明

UITextField只有在resignFirstResponder时才会改变它的宽度。 你可以给我任何关于这个问题的build议吗? 我是Swift和iOS开发中的新成员。

要使用Autolayout来做到这一点,你将需要一个文本字段宽度的约束。 然后,当文本更改时,计算所需宽度并将约束上的constant属性设置为该值。 最后,您需要在父视图上调用layoutIfNeeded()

UITextField更改内容时(它不是UITextFieldDelegate一部分),它不调用你的方法textFieldDidChange(_:) 。 你应该使用textField(_:shouldChangeCharactersInRange:replacementString:)来代替。

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

这适用于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() }