2010-12-29 3 views
1

Ich habe - (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row in meinem NSTableView-Delegaten implementiert, um die Höhe der Zeilen meiner Tabelle zu ändern, wenn sich die Breite der Spalte ganz links ändert. Das Problem besteht darin, dass nur diese Spalte während der Größenänderung (und jeder Spalte, die während der Größenänderung sichtbar wird) neu gezeichnet wird.Erzwingen Neuzeichnen als Größe NSTableColumn in NSTableView?

Dies ergibt die funky visuelle nach der Größenänderung. Was ich möchte, ist eine Möglichkeit, der Tabellenansicht zu sagen, dass sie komplett neu gezeichnet werden muss, während der Benutzer die Größe einer Spalte ändert. Im Moment kann ich höchstens setNeedsDisplay aufrufen, nachdem diese Spalte die Größenänderung beendet hat.

alt text

Antwort

1

Es mag nicht der einzige Weg sein, aber die Tabellenansicht wurde durch einen Core-Animation-Layer behoben. Es ist nicht 100% glatt, aber der durchschnittliche Benutzer würde es wahrscheinlich nie bemerken.

2

Schauen Sie sich die NSTableViewmethodnoteHeightOfRowsWithIndexesChanged:. Sie müssen ein NSIndexSet der Zeilen erstellen, deren Höhen sich geändert haben.

Update: Um einen sicheren Ort, um diese zu nennen, können Sie NSTableColumn Unterklasse die setWidth: Methode außer Kraft zu setzen. Sie können dann eine benutzerdefinierte Benachrichtigung posten, die Ihr Tabellendelegat beobachten kann, oder Sie können die Tabellensicht auch überschreiben und die Spalte veranlassen, dass die Tabelle ihrem Delegaten direkt mitteilt.

+0

Ich habe das probiert, weil ich es in der Dokumentation gesehen habe, aber ich kann es nicht von innen aufrufen '- (CGFloat) tableView: (NSTableView *) tableView heightOfRow: (NSInteger) Zeile, weil es eine Endlosschleife verursacht. – Dov

+0

@Dov Aktualisierung Vorschlag. – Richard

+0

Ich habe versucht, 'noteHeightOfRowsWithIndexesChanged:' und 'setNeedsDisplay' aus der 'setWidth:' - Überschreibung der benutzerdefinierten Spalte aufzurufen, und keine davon hat einen Unterschied gemacht. Was genau sagen Sie jetzt, sollte getan werden 'setWidth:'? Etwas, das dies vereinfachen könnte, ist, dass in meiner Anwendung, wenn sich die Höhe einer Zeile ändert, alle dies typischerweise tun. Das kann angenommen werden. – Dov