多行 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
使用您想要的常量。并且不要添加任何特定的高度限制。
下面是一些可能有用的屏幕截图。
我一直在尝试让多行 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
使用您想要的常量。并且不要添加任何特定的高度限制。
下面是一些可能有用的屏幕截图。