多行NSTextField不起作用

fum*_*007 3 macos cocoa nstextfield autolayout nsautolayout

我一直在尝试使用多行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)")
   }
}
Run Code Online (Sandbox Code Playgroud)

打印:

本质内容大小:(-1.0,21.0)

合身尺寸:(20.0,21.0)

(21.0是一行的大小。)

abd*_*lek 5

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

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

并添加以下示例约束

  • 尾随空间
  • 领导空间
  • 底部空间
  • 顶部空间

与所需的常量。并且不要添加任何特定的高度限制。

下面的一些屏幕截图可能会有所帮助。

约束条件

NSTextField设置


fum*_*007 4

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

\n\n

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

\n