设置文本时停止 UITextField 调整大小

问题描述 投票:0回答:2

我有一个视图设置,其中布局了 4 个 UITextFields 并设置了约束,以便它在所有设备上看起来都很棒并且按预期工作。 我有一个问题,如果我使用 TextField.text = @" some long text "; 设置文本或 [TextField setText:@"一些长文本"];它会导致文本字段扩展其宽度以适应文本的长度,然后由于限制,其他文本字段也会调整大小。

如何停止文本字段大小调整?我希望字段保持不变,并且用户如果想要到达末尾就能够滚动文本?

谢谢

ios objective-c iphone
2个回答
14
投票

你只需要改变约束即可。为 UITextField 提供显式的内部宽度约束(或使用约束以其他方式设置或限制其宽度),然后事情就会按照您的意愿运行。

请记住,一般来说,视图大小和位置的所有方面都必须由其约束明确配置。然而,现在您的文本字段没有宽度约束,因此其宽度基于其文本内容(即,它使用内在内容大小来获取其宽度)。省略宽度约束并不违法,这就是为什么 Interface Builder 在设置约束时没有抱怨的原因 - 但它是合法的,只是因为有一个提供宽度的内在内容大小,因此它确实意味着宽度会改变,如果内部文本发生变化。如果这不是您想要的,那么不要这样做 - 而是提供显式的宽度约束。 (类似地,文本字段的隐式高度为 30,这就是为什么您不必为其指定高度约束。该高度不会

随文本内容而变化,因为与 UILabel 不同,文本字段不会随文本内容而变化。不要将其文本换行为多行。)

在一些奇怪的情况下,求解器规则很难猜测。例如

0
投票

制作一个外部包装 UIView

    在其中放置一个文本字段,然后
  • 向包装器添加四个约束
  • 使用内在内容大小将包装器的宽度固定为 200
  • 将其中一些放入水平堆栈视图中,该视图可以自行调整大小(可能通过处于滚动视图中)
  • 在许多情况下,当您在文本字段中键入长文本时,它仍然会调整大小(即文本字段和包装器)。
在这种情况下,一种解决方案是

setContentCompressionResistancePriority(.required, for: .horizontal) setContentHuggingPriority(.required, for: .horizontal)

应用于包装器和/或文本字段本身。
    

© www.soinside.com 2019 - 2024. All rights reserved.