动态更改 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
【讨论】:
因为这个答案是正确和完整的,我不会说你错了(因为你不是),但UITextField
是UIControl
的子类...你可以添加状态 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 宽度取决于内容的主要内容,如果未能解决你的问题,请参考以下文章
Swift iOS尝试动态更改UITextAutocapitalization类型