阻止 UITextField 水平扩展

Posted

技术标签:

【中文标题】阻止 UITextField 水平扩展【英文标题】:Stop UITextField from expanding horizontally 【发布时间】:2015-08-17 23:54:13 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

我已经为您找到答案,但我现在无法发布,因为如果您在接下来的 6 个中找不到答案,有很多白痴会否决他们不理解的 ios 内容小时,我会发布它。祝你好运。 “问题在于,如果文本足够长,这会导致字段水平扩展,有时将按钮推到屏幕外”您需要从按钮到其超级视图的尾随约束,以防止出现这种情况从发生。基本上听起来你的界面没有足够的约束。您需要足够的约束来确定每个视图的大小(高度/宽度)和位置(x/y)。 我确实有一个从按钮到其超级视图的尾随约束。抱歉没有提及。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

选择文本视图,然后在大小检查器中: 1) 将“版面边距”设置为“固定”。 2) 在“Content Compression Resistance Priority”下,将“Horizo​​ntal”设置为“Low (250)”。

【讨论】:

降低 Content Compression Resistance 优先级是有道理的,但是为什么你将 Layout Margins 设置为 Fixed 呢?我能够在不将 Layout Margins 设置为 Fixed 的情况下使其工作......

以上是关于阻止 UITextField 水平扩展的主要内容,如果未能解决你的问题,请参考以下文章

Swift:UITextField 被键盘隐藏

UITextField PlaceHolder 颜色改变 Monotouch

firstRect(for:) 在 UITextField 中返回错误值

为啥从 Nib 加载的 UITextField 的默认字体太小?

UITextField 的初始键盘动画的超慢滞后/延迟

如何在 iOS 11 的 UITextfield 中启用拖动