我一直在尝试使用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是单行的大小。)
答案 0 :(得分:5)
使用自动约束和Interface Builder制作 NSTextField 多行的另一种解决方案。
Wraps
Character Wrap
unchecked
并添加以下示例约束
使用您想要的常量。并且不要添加任何特定的高度约束。
下面的一些屏幕截图可能会有所帮助。
答案 1 :(得分:1)
行。因此,当NSTextField
处于编辑模式时,秘密NSTextView
(也称为“字段编辑器”)接管编辑部分。在编辑结束之前,文本更改不会同步回文本字段。这解释了为什么我的示例代码仅在非编辑模式下工作。
您可以通过访问NSTextField.stringValue
属性强制进行同步。这就是我在NSTextField
子类中所做的。我还提供了自己的intrinsicContentSize
实现,因为Apple的实现在编辑模式下不起作用,并且在非编辑模式下有错误。