2016-07-27 28 views
1

Ich implementiere derzeit Drag & Drop-Neuanordnung in einer Tabellenansicht in meiner OS X App. Während das normale Scrollen gut funktioniert, wird das automatische Scrollen beim Ziehen völlig kaputt gemacht.NSTableView in NSScrollView scrollt beim Ziehen nicht automatisch

Wenn ich eine Zelle ergreife und anfange zu ziehen, sagt autoscroll nur die Tabelle, um nach oben zu scrollen. Wenn ich während des Ziehens mit dem Trackpad manuell scrollen, wird die Tabelle kontinuierlich nach oben verschoben. Wenn ich eine der oberen Zellen ziehe, wird die Tabelle beim Ziehen am unteren Rand nicht automatisch nach unten verschoben.

Ich Unterklasse NSScrollView und überschritt die scrollClipView Methode. Ich sehe, dass es von einer internen Autoscroll-Methode mit den Koordinaten von (0, 0) aufgerufen wird.

enter image description here

Da kann ich nicht sehen, was das interne Verfahren tut, und Goggle und SO sind Aufdrehen nichts, ich bin ein bisschen stecken.

Hat jemand schon einmal auf dieses Problem gestoßen? Aus vergangenen Erfahrungen habe ich das Gefühl, dass es etwas mit AutoLayout zu tun hat, aber ich habe keine Ahnung was. Oder vielleicht ist es etwas völlig anderes.

Irgendwelche Ideen zur weiteren Problembehandlung?

+0

Zeigen Sie uns Ihren Code. – Willeke

+0

Welchen Code möchten Sie sehen? Angesichts der Natur dieser Anwendung kann ich keine großen Teile der Codebasis freilegen. Gibt es etwas Besonderes? –

+0

Ich bin interessiert an: „Ich subclassed NSScrollView und überwog die scrollClipView-Methode.“ – Willeke

Antwort

2

Ich stieß auf das gleiche Problem. In meinem Fall war das Problem, dass ich die Höhe des NSTableCellView in Interface Builder auf 10.000 setzte, damit die horizontalen Trennzeichen nicht für leere Zeilen unterhalb der tatsächlichen Zeilen angezeigt wurden.

Die tatsächliche Höhe meiner NSTableCellViews geladen zur Laufzeit war 43px.

Sobald ich begann, eine Zelle zu ziehen, um sie neu zu ordnen, versuchte die NSScrollView, 10.000 Pixel auf einmal statt 43 auf einmal zu scrollen.

Dies scheint wie ein Fehler, da meine NSOutlineView Unterklasse die folgende Methode implementiert, um die Höhe jeder Zeile dynamisch festzulegen.

func outlineView(_ outlineView: NSOutlineView, heightOfRowByItem item: Any) -> CGFloat 

Offenbar diese Methode wird von dem Autoscroll-Mechanismus während der Drag-and-Drop-Operationen ignoriert, und nur der Wert im Interface Builder verwendet wird.

Also habe ich gerade die Höhe des Dummy NSTableCellView auf 43px in Interface Builder geändert, und ich lebe nur mit den horizontalen Trennzeichen für leere Zeilen angezeigt werden.

+0

Vielen Dank! Das hat funktioniert! –