2017-12-21 9 views
0

Ich habe eine outlineView, in der ich NSTextViews setze, die bei der Bearbeitung die Größe ändern (Think Outliner App). Ich habe das meiste davon funktioniert, aber etwas Verhalten ist inkonsistent.NSTextView in NSOutlineView mit IntrinsicContentSize Einstellung falscher Höhe

Auf meinem NSOutlineView I gesetzt:

outlineView?.usesAutomaticRowHeights = true 

Für meine Zelle-Ansichten, die ich NSTextView Unterklasse. Ich habe folgende Auto Layout Bits:

self.translatesAutoresizingMaskIntoConstraints = false 
setContentHuggingPriority(NSLayoutConstraint.Priority.defaultHigh, for: NSLayoutConstraint.Orientation.vertical) 

Und ich den inneren Gehalt Größenberechnung auf der NSTextView außer Kraft setzen:

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 
    } 

(Ich war in dem obigen Code ensureLayout auf dem Layoutmanager aufrufen, aber es fügt nichts)

intrinsicContentSize wird zweimal pro Textansicht aufgerufen, wenn sie dem Outliner hinzugefügt werden. Das erste Mal, dass die zurückgegebene Größe korrekt ist, aber beim zweiten Aufruf wird ein Teil des Texts unnötigerweise umbrochen. Ein Ausdruck der zwei Durchläufe auf intrinsicContentSize für 4 Textansichten ist unten gezeigt. Die Spaltenbreite beträgt 281, daher sollte keine dieser Zeichenfolgen umbrochen werden. Der erste Durchlauf sie alle auf eine Zeile passen (14 hoch), im zweiten Durchgang, die letzten beiden Saiten wickeln, was seltsam ist, weil sie nicht die längsten Saiten sind:

(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 

Es ist durchweg die gleichen Strings, resultieren in demselben Verhalten. Z.B. Die Zeichenfolge "Related Subjects" wird nie umbrochen, die Zeichenfolge "Related Terms" wird immer umbrochen.

Wenn die Ansichten dargestellt werden, wird der Text NICHT tatsächlich umbrochen, auch wenn der usedRect-Wert dies impliziert. Der Text wird korrekt angezeigt, aber die Zeilenansicht im Outliner ist zu hoch, da er zwei Textzeilen enthält.

enter image description here

Alle Hinweise, wo ich etwas fehlen könnte? Bezieht sich "useLayout" irgendwie auf seine vorherige Berechnung und hat dann Rundungsprobleme, wenn dieselbe Zeichenfolge in ihre zuletzt berechnete Breite passt?

Antwort

0

OK, der Schlüssel hier war, dass der Text korrekt dargestellt wurde, aber die Größe der Ansicht falsch war.

Ich habe ein Delagate für den NSTextView LayoutManager erstellt. Der Text wurde 3 Mal ausgegeben, nachdem NSTextView zu NSOutlineView hinzugefügt wurde (was sehr ineffizient zu sein scheint!). intrinsicContentSize wurde nur für die NSTextView nach den ersten beiden Textlayouts aufgerufen.

Aufruf von invalidateIntrinsicContentSize aus dem LayoutManager: didCompleteLayoutFor ... hat alles repariert.

Ich verstehe immer noch nicht, was hier passiert, und warum all diese Methoden so oft aufgerufen werden, wenn Zeug präsentiert wird. Ich nehme an, es liegt an der Komplexität des Auto-Layouts und der Dinge, die sich gegenseitig bedrohen.

Ich verstehe auch nicht, warum nur einige der Berechnungen während des Prozesses falsch waren.

Bitte kommentieren Sie hier, wenn irgendjemand etwas Licht dazu bringen kann!

Verwandte Themen