阻止UITextField水平扩展

时间:2015-08-17 23:54:14

标签: ios autolayout uitextfield

我有一个UITextField位于按钮旁边的视图中。它对按钮的尾随约束为8(对于superview有一个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更宽。所以如果我在场的当前宽度上设置小于或等于宽度约束,那么似乎该字段仍然可以在较小的设备上扩展而不会破坏该约束。

有没有更好的方法来做这样的宽度约束?如果没有,我怎么能保持场地不扩展并在屏幕外按下按钮?

3 个答案:

答案 0 :(得分:13)

这是问题所在。文本字段倾向于将其自身水平地调整为其内容。该按钮倾向于将本身水平调整为内容。因此,您有一个歧义:这些趋势具有相同的优先级,因此运行时不知道哪个崩溃,因为文本字段的文本太长。

解决方案是调整这些优先事项。您必须降低文本字段的水平压缩和拥抱优先级 - 低一点就足够了。现在按钮会更强烈地将自己的大小与其内容相匹配,文本字段将剪切其内容。

enter image description here

答案 1 :(得分:3)

选择“文本”视图,然后在“大小”检查器中: 1)设置"布局边距"到"固定"。 2)在"内容压缩电阻优先级"下,设置"水平"成为"低(250)"。

答案 2 :(得分:2)

您也可以以编程方式降低 Content Compression Resistance(如果您在 UIViewRepresentable 中使用 SwiftUi,这也适用):

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

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

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