【问题标题】:NSTextField resizable to fit contentNSTextField 可调整大小以适应内容
【发布时间】:2015-09-29 14:42:25
【问题描述】:

我有定义了左、右和顶部约束的 NSTextField(没有设置底部约束)。如果内容无法放入其中,我需要 NSTextField 增长,如果还有未使用的空间,我需要减小大小。

现在我有了:如果 NSTextField 包含多行文本或内容过多,它会以奇怪的行为自动扩展,而且 NSTextField 不会在调整窗口大小时减小自己的大小。

我还没有找到任何用 Swift 编写的简单解决方案来解决这个问题(我有很多这样的带有约束的标签),在 iOS 上,一切都在使用通常的文本标签和约束。

我为那个问题创建了一个简单的项目,你可以看到问题:[Download Text.zip]

我找到但没有使用的解决方案:

  1. 您可以尝试计算可能的 TextField 高度并为其设置高度约束。该解决方案的问题:

    • 可能的高度计算不准确,有时您计算的高度不正确。
    • 解决方案是在 Objective-C 上使用一些复杂的代码编写的。
  2. 在每个窗口调整大小或文本更改操作上运行 .sizeToFit()。它不起作用,因为 .sizeToFit() 总是将所有文本压缩到单行。

  3. 使用 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


【解决方案1】:

根据Mac OS X Release Notes(NSTextField intrinsicContentSize 改进部分),当 NSTextField 的高度改变但宽度保持不变时,这是一个已知的错误。我们有两种修复方法:

  1. 我们可以将maximumNumberOfLines 指定为一个有意义的值。这对我们来说不是一个好方法,因为我们不知道实际的行数,也不想计算它。
  2. 我们可以将preferredMaxLayoutWidth 设置为一个实际值。我以这样的代码结束:

代码:

override func viewDidLayout() {
    super.viewDidLayout()
    textField.preferredMaxLayoutWidth = textField.frame.width
}

【讨论】:

猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 2020-10-09
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2011-08-12
  • 1970-01-01
相关资源
最近更新 更多