多行 NSTextField 不工作

Multi-line NSTextField not working

我一直在尝试让多行 NSTextField 使用 preferredMaxLayoutWidth 自动布局。我不明白为什么这不起作用。

class ViewController: NSViewController {
   override func viewDidLoad() {
      super.viewDidLoad()

      let textField = NSTextField()
      textField.cell!.usesSingleLineMode = false
      textField.cell!.wraps = true
      textField.cell!.lineBreakMode = .byCharWrapping
      view.addSubview(textField)

      textField.translatesAutoresizingMaskIntoConstraints = false
      NSLayoutConstraint.activate([
         textField.topAnchor.constraintEqual(to: view.topAnchor),
         textField.leadingAnchor.constraintEqual(to: view.leadingAnchor),
         textField.widthAnchor.constraintEqual(toConstant: 20)
      ])
      textField.preferredMaxLayoutWidth = 20
      textField.stringValue = "abcdefghijklmnopqrstuvwxyz"

      view.needsLayout = true
      view.layoutSubtreeIfNeeded()
      print("Intrinsic content size: \(textField.intrinsicContentSize)")
      print("Fitting size: \(textField.fittingSize)")
   }
}

这会打印:

Intrinsic content size: (-1.0, 21.0)

Fitting size: (20.0, 21.0)

(21.0 是单行的大小。)

好的。所以事实证明,当 NSTextField 处于编辑模式时,秘密 NSTextView(又名“字段编辑器”)接管编辑部分。在编辑结束之前,文本更改不会同步回文本字段。这就解释了为什么我的示例代码只能在非编辑模式下工作。

您可以通过访问 NSTextField.stringValue 属性 强制进行同步。这就是我在 NSTextField 子类中所做的。我还提供了我自己的 intrinsicContentSize 实现,因为 Apple 的实现在编辑模式下不起作用,并且在非编辑模式下存在错误。

还有另一种解决方案,可以使用自动约束和 Interface Builder 使 NSTextField 多行。

  • 布局中选择Wraps
  • 换行选项中选择Character Wrap
  • 使用单行模式必须unchecked

并添加以下示例约束

  • 尾随 Space
  • 领先Space
  • 底部Space
  • 顶部Space

使用您想要的常量。并且不要添加任何特定的高度限制。

下面是一些可能有用的屏幕截图。