多行NSTextField无法正常工作

时间:2016-06-07 23:47:48

标签: macos cocoa autolayout nstextfield 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)")
   }
}

打印:

  

内在内容大小:( - 1.0,21.0)

     

拟合尺寸:(20.0,21.0)

(21.0是单行的大小。)

2 个答案:

答案 0 :(得分:5)

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

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

并添加以下示例约束

  • 尾随空间
  • 领先空间
  • 底部空间
  • 顶级空间

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

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

Constraints

NSTextField Settings

答案 1 :(得分:1)

行。因此,当NSTextField处于编辑模式时,秘密NSTextView(也称为“字段编辑器”)接管编辑部分。在编辑结束之前,文本更改不会同步回文本字段。这解释了为什么我的示例代码仅在非编辑模式下工作。

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