NSOutlineView 中的 NSTextView 与 IntrinsicContentSize 设置错误的高度

Posted

技术标签:

【中文标题】NSOutlineView 中的 NSTextView 与 IntrinsicContentSize 设置错误的高度【英文标题】:NSTextView in NSOutlineView with IntrinsicContentSize setting wrong height 【发布时间】:2017-12-21 15:15:59 【问题描述】:

我有一个大纲视图,我将 NSTextViews 放入其中,在编辑时调整大小(想想大纲应用程序)。我有大部分工作,但有些行为不一致。

在我设置的 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 个文本视图的内在内容大小的两次传递的打印输出。列宽是 281,所以这些字符串都不应该换行。第一遍它们都适合一条线(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' 是否以某种方式引用它之前的计算,然后在将相同的字符串拟合到其最后计算的宽度时出现舍入问题?

【问题讨论】:

【参考方案1】:

好的,这里的关键是文本显示正确但视图大小错误。

我为 NSTextView 的 layoutManager 创建了一个 delagate。将 NSTextView 添加到 NSOutlineView 后,文本被设置了 3 次(这似乎非常低效!)。在前两个文本布局之后,仅在 NSTextView 上调用了 intrinsicContentSize。

从 layoutManager 中调用 invalidateIntrinsicContentSize:didCompleteLayoutFor... 修复了所有问题。

我仍然不明白这里发生了什么,以及为什么所有这些方法在呈现内容时被调用这么多次。我想这与自动布局的复杂性和相互推挤的事物有关。

我也不明白为什么在这个过程中只有一些计算不正确。

如果有人可以对此有所了解,请在此处发表评论!

【讨论】:

以上是关于NSOutlineView 中的 NSTextView 与 IntrinsicContentSize 设置错误的高度的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将核心数据实体中的项目放入 NSOutlineView?

如何自动选择插入到 NSOutlineView & Core Data 中的项目

如何遍历我的 NSOutlineView 的所有项目?

NSOutlineView中的NSTextView与IntrinsicContentSize设置错误的高度

NSOutlineView -- reloadItem:reloadChildren: 让我的应用程序崩溃

自定义 NSMangedObject 访问器崩溃 NSOutlineView