【发布时间】:2015-09-29 14:42:25
【问题描述】:
我有定义了左、右和顶部约束的 NSTextField(没有设置底部约束)。如果内容无法放入其中,我需要 NSTextField 增长,如果还有未使用的空间,我需要减小大小。
现在我有了:如果 NSTextField 包含多行文本或内容过多,它会以奇怪的行为自动扩展,而且 NSTextField 不会在调整窗口大小时减小自己的大小。
我还没有找到任何用 Swift 编写的简单解决方案来解决这个问题(我有很多这样的带有约束的标签),在 iOS 上,一切都在使用通常的文本标签和约束。
我为那个问题创建了一个简单的项目,你可以看到问题:[Download Text.zip]
我找到但没有使用的解决方案:
-
您可以尝试计算可能的 TextField 高度并为其设置高度约束。该解决方案的问题:
- 可能的高度计算不准确,有时您计算的高度不正确。
- 解决方案是在 Objective-C 上使用一些复杂的代码编写的。
在每个窗口调整大小或文本更改操作上运行 .sizeToFit()。它不起作用,因为 .sizeToFit() 总是将所有文本压缩到单行。
-
使用 NSTextView 代替 NSTextField。这是个好方法,但是:
- 我不需要NSTextView的滚动、编辑等功能。我不想为简单的标签调用复杂的组件。
- NSTextView 总是需要高度或底部约束,我不知道底部约束,因为内容可以随着新文本向下扩展。
- 我还没有找到完整的解决方案来使 NSTextView 的行为像我想要的那样:)
【问题讨论】:
-
禁用第一个运行时布局宽度并使用此 textField.needsLayout = true textField.needsUpdateConstraints = true textField.needsDisplay = true。我不知道如何强制刷新视图而不是 NSWindow 实时调整大小。因此,一旦您调用 addText,视图就不会展开。但它会在调整窗口大小时正确重绘。
-
@xhruso00,如果我禁用第一个运行时布局 NSTextField 始终显示为 1 行。 needsLayout、needsUpdateConstraints、needsDisplay 完全没有效果(在我的测试中)。
-
点击按钮后是否调整了窗口大小?只有这样视图才会刷新。如果您解决了重绘问题,它将按照您的意愿运行,几乎不需要任何代码。
-
@xhruso00,我在 addText 操作上添加了代码,无论是否调整窗口大小都不起作用。你可以在这里查看 XCode 的示例:dl.dropboxusercontent.com/u/42855950/Text2.zip
-
你是对的。我评论了我推荐的代码,调整大小是 El Cap 上的默认行为。你必须检查 AppKit 内部他们做什么或等待。 onlinevideoconverter.com/…
标签: macos swift nstextfield nstextview