NSTextField 可调整大小以适应内容
NSTextField resizable to fit content
我的 NSTextField 定义了左、右和顶部约束(未设置底部约束)。如果内容放不下,我需要 NSTextField 增长,如果还有未使用的 space,我需要减小它的大小。
现在我有了:如果 NSTextField 有多行文本或内容太多,它会自动扩展并出现奇怪的行为,而且 NSTextField 在 window 调整大小时不会减小自己的大小。
我还没有在 Swift 上找到任何简单的解决方案来解决这个问题(我有很多这样的带有约束的标签),在 iOS 一切都可以使用普通的文本标签和约束。
我已经为这个问题创建了一个简单的项目,您可以看到问题所在:[Download Text.zip]
找到但没用过的方案:
您可以尝试计算可能的TextField高度并为其设置高度限制。该解决方案的问题:
- 可能是身高计算不准确,有时你计算的身高不正确。
- 解决方案写在 Objective-C 上,代码有些复杂。
运行 .sizeToFit() 在每个 window 调整大小或文本更改操作上。它不起作用,因为 .sizeToFit() 总是将所有文本压缩为单行。
使用 NSTextView 而不是 NSTextField。这是个好方法,但是:
- 我不需要 NSTextView 的滚动、编辑和其他功能。我不想为简单的标签调用复杂的组件。
- NSTextView 总是需要高度或底部约束,我不知道底部约束,因为内容可以用新文本向下扩展。
- 我还没有找到让 NSTextView 的行为像我想要的那样的完整解决方案:)
根据 Mac OS X Release Notes(NSTextField intrinsicContentSize 改进部分),当 NSTextField 的高度发生变化但宽度保持不变时,这是一个已知错误。我们有两种修复方法:
- 我们可以将
maximumNumberOfLines
指定为一个有意义的值。这对我们来说不是好方法,因为我们不知道实际的行数,也不想计算它。
- 我们可以将
preferredMaxLayoutWidth
设置为一个真实的值。我以这样的代码结束:
代码:
override func viewDidLayout() {
super.viewDidLayout()
textField.preferredMaxLayoutWidth = textField.frame.width
}
我的 NSTextField 定义了左、右和顶部约束(未设置底部约束)。如果内容放不下,我需要 NSTextField 增长,如果还有未使用的 space,我需要减小它的大小。
现在我有了:如果 NSTextField 有多行文本或内容太多,它会自动扩展并出现奇怪的行为,而且 NSTextField 在 window 调整大小时不会减小自己的大小。
我还没有在 Swift 上找到任何简单的解决方案来解决这个问题(我有很多这样的带有约束的标签),在 iOS 一切都可以使用普通的文本标签和约束。
我已经为这个问题创建了一个简单的项目,您可以看到问题所在:[Download Text.zip]
找到但没用过的方案:
您可以尝试计算可能的TextField高度并为其设置高度限制。该解决方案的问题:
- 可能是身高计算不准确,有时你计算的身高不正确。
- 解决方案写在 Objective-C 上,代码有些复杂。
运行 .sizeToFit() 在每个 window 调整大小或文本更改操作上。它不起作用,因为 .sizeToFit() 总是将所有文本压缩为单行。
使用 NSTextView 而不是 NSTextField。这是个好方法,但是:
- 我不需要 NSTextView 的滚动、编辑和其他功能。我不想为简单的标签调用复杂的组件。
- NSTextView 总是需要高度或底部约束,我不知道底部约束,因为内容可以用新文本向下扩展。
- 我还没有找到让 NSTextView 的行为像我想要的那样的完整解决方案:)
根据 Mac OS X Release Notes(NSTextField intrinsicContentSize 改进部分),当 NSTextField 的高度发生变化但宽度保持不变时,这是一个已知错误。我们有两种修复方法:
- 我们可以将
maximumNumberOfLines
指定为一个有意义的值。这对我们来说不是好方法,因为我们不知道实际的行数,也不想计算它。 - 我们可以将
preferredMaxLayoutWidth
设置为一个真实的值。我以这样的代码结束:
代码:
override func viewDidLayout() {
super.viewDidLayout()
textField.preferredMaxLayoutWidth = textField.frame.width
}