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

时间:2017-12-21 15:15:59

标签: swift cocoa autolayout nsoutlineview

我有一个outlineView,我在其中放置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在添加到outliner时每个文本视图调用两次。第一次返回的大小是正确的,但在第二次调用时,一些文本不必要地换行。下面显示了4个文本视图的intrinsicContentSize上的两个传递的打印输出。列宽为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

导致相同行为的字符串始终相同。例如。字符串“相关主题”从不包装,字符串“相关术语”总是包装。

当显示视图时,文本实际上并未被包装,甚至认为usedRect值暗示它将是。文本显示正确,但是大纲中的行视图太高,因为它认为它有两行文本。

enter image description here

我可能遗失某些东西的指针? 'ensureLayout'是否以某种方式引用它之前的计算,然后在将相同的字符串拟合到其最后计算的宽度时会出现舍入问题?

1 个答案:

答案 0 :(得分:0)

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

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

从layoutManager中调用invalidateIntrinsicContentSize:didCompleteLayoutFor ...修复了所有内容。

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

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

如果有人能对此有所了解,请在这里发表评论!