NSOutlineView
中的 NSTextView
在使用 IntrinsicContentSize
时可能会遇到高度设置错误的问题。这通常是由于 NSTextView
的内容动态变化时,其固有内容大小(Intrinsic Content Size)没有正确更新导致的。
IntrinsicContentSize 是一个自动计算的尺寸,它基于内容的大小来确定视图应该占据的空间。对于 NSTextView
来说,这个尺寸会根据文本的内容动态变化。
NSTextView
的内容发生变化时,如果没有正确触发视图的重绘,IntrinsicContentSize
可能不会更新。NSTextView
的布局约束设置不当,也可能导致高度计算错误。IntrinsicContentSize
已经被计算并应用,从而导致高度不正确。在内容更新后,手动调用 invalidateIntrinsicContentSize
方法来强制 NSTextView
重新计算其固有内容大小。
textView.textDidChange(notification: notification)
textView.invalidateIntrinsicContentSize()
确保 NSTextView
的布局约束正确设置,特别是与高度相关的约束。
textView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
textView.topAnchor.constraint(equalTo: someView.topAnchor),
textView.bottomAnchor.constraint(equalTo: someView.bottomAnchor),
textView.leadingAnchor.constraint(equalTo: someView.leadingAnchor),
textView.trailingAnchor.constraint(equalTo: someView.trailingAnchor)
])
如果内容是异步加载的,可以在内容加载完成后,再次设置 NSTextView
的内容,并触发重绘。
DispatchQueue.main.async {
self.textView.string = newContent
self.textView.invalidateIntrinsicContentSize()
}
这种问题常见于需要动态显示大量文本的应用,如文档编辑器、聊天应用等。在这些场景中,NSTextView
的内容可能会频繁变化,因此需要确保其高度能够正确适应内容的变化。
以下是一个简单的示例,展示了如何在 NSTextView
内容变化时更新其固有内容大小:
import Cocoa
class MyOutlineViewDelegate: NSObject, NSOutlineViewDelegate {
func outlineView(_ outlineView: NSOutlineView, willDisplayCell cell: Any, for tableColumn: NSTableColumn?, item: Any) {
if let textView = cell as? NSTextView {
textView.delegate = self
}
}
}
extension MyOutlineViewDelegate: NSTextViewDelegate {
func textDidChange(_ notification: Notification) {
if let textView = notification.object as? NSTextView {
textView.invalidateIntrinsicContentSize()
}
}
}
通过上述方法,可以有效解决 NSOutlineView
中 NSTextView
的 IntrinsicContentSize
高度设置错误的问题。
领取专属 10元无门槛券
手把手带您无忧上云