NSOutlineView 中的 NSTextView 与 IntrinsicContentSize 设置错误的高度
NSTextView in NSOutlineView with IntrinsicContentSize setting wrong height
我有一个 outlineView,我在其中放置了 NSTextView,它在编辑时会调整大小(想想 outliner 应用程序)。我的大部分工作正常,但有些行为不一致。
在我的 NSOutlineView 上我设置了:
outlineView?.usesAutomaticRowHeights = true
对于我的单元格视图,我继承了 NSTextView。我设置了以下自动布局位:
self.translatesAutoresizingMaskIntoConstraints = false
setContentHuggingPriority(NSLayoutConstraint.Priority.defaultHigh, for: NSLayoutConstraint.Orientation.vertical)
然后我覆盖了 NSTextView 上的固有内容大小计算:
override var intrinsicContentSize: NSSize {
guard let manager = textContainer?.layoutManager else {
return .zero
}
print("\(manager.usedRect(for: textContainer!).size) \(string)")
return manager.usedRect(for: textContainer!).size
}
(我在上面的代码中在 layoutManager 上调用了 ensureLayout 但它什么也没添加)
当每个文本视图被添加到大纲时,intrinsicContentSize 被调用两次。第一次返回的大小是正确的,但在第二次调用时一些文本不必要地换行。下面显示了 4 个文本视图在 intrinsicContentSize 上两次传递的打印输出。列宽为 281,因此这些字符串中的 none 应该换行。第一遍它们都适合一行(14 高),在第二遍中,最后两个字符串换行,这很奇怪,因为它们不是最长的字符串:
(178.744140625, 14.0) New pointwddwek kelekwelek...
(100.720703125, 14.0) Related Subjects
(119.400390625, 14.0) Related Publications
(87.150390625, 14.0) Related Terms
(178.744140625, 14.0) New pointwddwek kelekwelek...
(100.720703125, 14.0) Related Subjects
(74.705078125, 28.0) Related Publications
(54.484375, 28.0) Related Terms
相同的字符串始终会导致相同的行为。例如。字符串 "Related Subjects" 从不换行,字符串 "Related Terms" 总是换行。
呈现视图时,文本实际上并未换行,即使 usedRect 值暗示它会换行。文本显示正确,但大纲中的行视图太高,因为它认为它有两行文本。
我可能遗漏了什么的任何指示? 'ensureLayout' 是否以某种方式引用了它之前的计算,然后在将相同的字符串放入其最后计算的宽度时出现舍入问题?
好的,这里的关键是文本显示正确,但视图大小错误。
我为 NSTextView 的布局管理器创建了一个委托。在将 NSTextView 添加到 NSOutlineView 之后,文本被设置了 3 次(这似乎非常低效!)。 intrinsicContentSize 仅在前两个文本布局之后在 NSTextView 上被调用。
从 layoutManager 中调用 invalidateIntrinsicContentSize:didCompleteLayoutFor... 修复了一切。
我仍然不明白这里发生了什么,以及为什么在呈现内容时所有这些方法被调用这么多次。我想这与自动布局的复杂性和相互推动的事物有关。
我也不明白为什么在这个过程中只有部分计算不正确。
如果有人能对此有所启发,请在这里发表评论!
我有一个 outlineView,我在其中放置了 NSTextView,它在编辑时会调整大小(想想 outliner 应用程序)。我的大部分工作正常,但有些行为不一致。
在我的 NSOutlineView 上我设置了:
outlineView?.usesAutomaticRowHeights = true
对于我的单元格视图,我继承了 NSTextView。我设置了以下自动布局位:
self.translatesAutoresizingMaskIntoConstraints = false
setContentHuggingPriority(NSLayoutConstraint.Priority.defaultHigh, for: NSLayoutConstraint.Orientation.vertical)
然后我覆盖了 NSTextView 上的固有内容大小计算:
override var intrinsicContentSize: NSSize {
guard let manager = textContainer?.layoutManager else {
return .zero
}
print("\(manager.usedRect(for: textContainer!).size) \(string)")
return manager.usedRect(for: textContainer!).size
}
(我在上面的代码中在 layoutManager 上调用了 ensureLayout 但它什么也没添加)
当每个文本视图被添加到大纲时,intrinsicContentSize 被调用两次。第一次返回的大小是正确的,但在第二次调用时一些文本不必要地换行。下面显示了 4 个文本视图在 intrinsicContentSize 上两次传递的打印输出。列宽为 281,因此这些字符串中的 none 应该换行。第一遍它们都适合一行(14 高),在第二遍中,最后两个字符串换行,这很奇怪,因为它们不是最长的字符串:
(178.744140625, 14.0) New pointwddwek kelekwelek...
(100.720703125, 14.0) Related Subjects
(119.400390625, 14.0) Related Publications
(87.150390625, 14.0) Related Terms
(178.744140625, 14.0) New pointwddwek kelekwelek...
(100.720703125, 14.0) Related Subjects
(74.705078125, 28.0) Related Publications
(54.484375, 28.0) Related Terms
相同的字符串始终会导致相同的行为。例如。字符串 "Related Subjects" 从不换行,字符串 "Related Terms" 总是换行。
呈现视图时,文本实际上并未换行,即使 usedRect 值暗示它会换行。文本显示正确,但大纲中的行视图太高,因为它认为它有两行文本。
我可能遗漏了什么的任何指示? 'ensureLayout' 是否以某种方式引用了它之前的计算,然后在将相同的字符串放入其最后计算的宽度时出现舍入问题?
好的,这里的关键是文本显示正确,但视图大小错误。
我为 NSTextView 的布局管理器创建了一个委托。在将 NSTextView 添加到 NSOutlineView 之后,文本被设置了 3 次(这似乎非常低效!)。 intrinsicContentSize 仅在前两个文本布局之后在 NSTextView 上被调用。
从 layoutManager 中调用 invalidateIntrinsicContentSize:didCompleteLayoutFor... 修复了一切。
我仍然不明白这里发生了什么,以及为什么在呈现内容时所有这些方法被调用这么多次。我想这与自动布局的复杂性和相互推动的事物有关。
我也不明白为什么在这个过程中只有部分计算不正确。
如果有人能对此有所启发,请在这里发表评论!