如何在键入时使 UITextField 宽度调整为文本?

Posted

技术标签:

【中文标题】如何在键入时使 UITextField 宽度调整为文本?【英文标题】:How to make UITextField width adjust to text as you type? 【发布时间】:2016-12-16 15:30:26 【问题描述】:

我有一个UITextField,旁边有一个标签,上面写着“米”。这个想法是您可以在文本字段中输入一个数字,然后“仪表”一词将显示在它旁边。文本字段没有边框,因此当您不编辑文本字段时,它看起来就像一行文本。

为此,我需要将文本字段的宽度设为文本的宽度。因此,它需要在您键入时变得更宽。但是,这不会在您键入时发生。但是,如果您旋转设备,尺寸会根据内容进行调整。所以基本上我需要在你旋转时触发任何触发器以获得我想要的。

我在UIControlEvents.editingChanged 方法中尝试了很多东西,例如setNeedsLayoutsetNeedsDisplaylayoutSubViews()setNeedsUpdateConstraints(),但没有运气。

另一种方法是使用sizeToFit(),然后将frame.size.width 设置为文本字段的宽度约束。这确实有效,但仅在您第一次编辑时。当您第二次编辑时,sizeToFit() 总是以某种方式返回相同的结果。

有什么想法吗?

更新:我最终使用了不同的方法。我将文本字段设置为全宽,并将仪表标签放在其顶部。当您键入时,它会计算文本的宽度,并且仪表标签会通过更改左侧约束常数相应地向右移动。这样标签总是紧挨着输入的数字。

我仍然没有找到一种方法可以在您键入时更改文本字段的宽度而不会造成所有错误,但我真的不再需要它了。

【问题讨论】:

请检查***.com/questions/18236661/… 我认为这是同一个问题。 【参考方案1】:

我觉得你应该在里面表演

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

这个函数只是决定新输入的字符是否应该附加在 TextField 的 contentView 的末尾。每次用户输入时都会调用这个函数。

我认为UIControlEvents.editingChanged 只会在 textField 获得焦点或失去焦点时通知您,但不会在值更改时通知您。

【讨论】:

@Janneman。我希望这对你有帮助。我在编写项目时遇到了同样的问题。我以编程方式解决了它。

以上是关于如何在键入时使 UITextField 宽度调整为文本?的主要内容,如果未能解决你的问题,请参考以下文章

防止 UITextField 在键入时更改宽度

当使用Tkinter的包布局时,如何在调整窗口大小时使Label的强度等于窗口的宽度?

如何调整 UITextField 占位符文本以适合 UITextField 宽度?

自动调整大小时 UITextField 字体粗细变化

Swift - 如何在使用软件键盘时使 UITextField 可见? [复制]

UITextField 的宽度永远不会小于占位符文本的宽度