阻止 UITextField 水平扩展

Stop UITextField from expanding horizontally

我在按钮旁边的视图中放置了一个 UITextField。它对按钮有一个 8 的尾随约束(它对超级视图有一个 8 的尾随约束),当我在其中键入长文本时,它只是滚动,这是我想要的。但是,为了在视图切换到另一个视图(位于选项卡控制器中)时保留字段中键入的文本,我将文本保存在 holder 变量中,当它切换回该视图时,我将文本设置为保存文本的字段。

问题是,如果文本足够长,这会导致字段水平扩展,有时会将按钮推到屏幕外,即使尾随 8 约束也是如此。我试图将字段的原始框架保存在 holder 变量中,然后在设置文本后,将框架设置为保存的原始框架,如下所示:

fieldFrame = messageField.frame
println(messageField.frame.width)
messageField.text = holderMessage
println(messageField.frame.width)
messageField.frame = fieldFrame

但是字段还是扩大了,打印了两次502.0。我目前的想法是框架没有及时为 println 设置文本后记录宽度的变化,但我不确定这是否正确。

另外,我读过一些建议使用宽度约束的类似问题。如果我在场地上使用小于或等于宽度的约束,如果在更薄的设备上,它还会扩展吗?也就是说,由于我目前使用的是任意宽度和任意高度的情节提要,它比 iPhone 6 更宽。因此,如果我对当前宽度设置小于或等于宽度约束这个领域,似乎这个领域仍然可以在更小的设备上扩展而不打破这个限制。

有没有更好的方法来做这样的宽度限制?如果不是,我还能如何防止字段扩展并将按钮推到屏幕外?

问题来了。文本字段倾向于根据其内容水平调整自身大小。该按钮倾向于将自身 的大小水平调整为 内容。因此你有一个歧义:这些趋势具有相同的优先级,所以运行时不知道在文本字段的文本太长时折叠哪一个。

解决方案是调整这些优先级。您必须 降低 文本字段的水平压缩和拥抱优先级 - 降低一分就足够了。现在按钮将更倾向于将其自身的大小与其内容相匹配,并且文本字段将裁剪其内容。

选择文本视图,然后在大小检查器中: 1) 将 "Layout Margins" 设置为 "Fixed"。 2) 在 "Content Compression Resistance Priority" 下,将 "Horizontal" 设置为 "Low (250)"。

您还可以通过编程降低 Content Compression Resistance(如果您在 SwiftUi 中使用 UIViewRepresentable,这也有效):

uiTextField.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

有关此主题的更多信息,请参阅:

https://medium.com/@dineshk1389/content-hugging-and-compression-resistance-in-ios-35a0e8f19118