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

Posted

技术标签:

【中文标题】动态更改 UITextField 宽度取决于内容【英文标题】:Change UITextField width dynamically depends of content 【发布时间】:2016-05-20 20:19:21 【问题描述】:

我和这里有同样的问题:Resize a UITextField while typing (by using Autolayout)

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

这段代码没有帮助:

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

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

和约束:

但是UITextField 只有在resignFirstResponder 时才改变它的宽度。 你能给我关于这个问题的任何建议吗? 我是 Swift 和 ios 开发的新手。

【问题讨论】:

【参考方案1】:

UITextField 在更改内容时不会调用您的方法textFieldDidChange(_:)(它不是UITextFieldDelegate 的一部分)。你应该改用textField(_:shouldChangeCharactersInRange:replacementString:)

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

【讨论】:

因为这个答案是正确和完整的,我不会说你错了(因为你不是),但UITextFieldUIControl 的子类...你可以添加状态 Editing Changed 的目标(可能在代码中和来自 IB)...您可以在此处检测文本是否更改。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于动态更改 UITextField 宽度取决于内容的主要内容,如果未能解决你的问题,请参考以下文章

防止 UITextField 在键入时更改宽度

Swift iOS尝试动态更改UITextAutocapitalization类型

检测UITextField的焦点更改

UITextField 不会自动调整宽度以适应内容,直到 resignFirstResponder 被调用?

指定视图大小何时取决于多个子视图的约束

画布更改宽度取决于完成百分比