NSTableView: So zeichnen Sie benutzerdefinierte Trennzeichen vor und nach einer ausgewählten Zeile

8

Dies ist meine erste Frage hier, und ich werde versuchen, es so klar wie möglich zu machen.

Ich möchte einen benutzerdefinierten Farbverlauf für eine ausgewählte Zeile in einem view-basierten NSTableView zeichnen und dabei einen subtilen erhöhten Effekt hinzufügen. Dafür muss ich eine dunklere Farbe für die Gitterlinien verwenden, die vor und nach der ausgewählten Zeile liegen (siehe hier für ein Beispiel). . Ich habe drawSeparatorInRect: Methode in NSTableRowView überschrieben, um die benutzerdefinierte Trennlinie für die ausgewählte Zeile zu zeichnen (mit isSelected method als Flag), aber ich kann nicht das gleiche für die oben / unten ( da ich die Linie unten / oben zeichne).

Ich habe mehrere Möglichkeiten ausprobiert, der nächsten Zeile zu sagen, dass sie eine dunklere Trennlinie ohne Erfolg zeichnen sollte, da der Anzeigeschritt nicht der gleichen Reihenfolge folgt (ich habe es mit NSLogs in drawSeparatorInRect: überprüft) Wenn Sie ein wenig scrollen, ändert sich diese Reihenfolge). Also, manchmal (meistens nach dem Scrollen) weiß die Reihe nicht, dass sie eine dunklere Farbe verwenden sollte, da sie sich vor dem ausgewählten malt (ich denke, zu diesem Zeitpunkt ist der ausgewählten Zeile noch nicht bewusst, dass sie ausgewählt ist, sonst I verstehe nicht, was vor sich geht).

Einige der Dinge, die ich versuchte:

  1. In der Methode drawSeparatorInRect: der ausgewählten Zeile habe ich versucht, auf die Geschwisteransichten ( [superview subviews] ) zuzugreifen und die vorherige / nächste zu zwingen, sich selbst zu zeichnen.
  2. Ändern Sie in der Unterklasse NSTableView direkt die nächste Zeile, wenn selectedIndexes sich ändert.
  3. Zeichnen Sie die Zeile außerhalb der ausgewählten Zeile innerhalb ihrer drawSeparatorInRect: -Methode, indem Sie hier .

Beachten Sie, dass ich Folgendes hatte: eine Zeilenansicht, in der gefragt wird, ob die vorherige / nächste ausgewählt wurde, ein nestRowIsSelected Flag oder extern eine Methode aufrufen, um die dunkle Farbe zu erzwingen.

Was ich jetzt habe, ist, dass die ausgewählte Zeile sowohl obere als auch untere Ränder zeichnet, also wird einer von ihnen zur vorherigen / nächsten Zeile zusammengefügt ... Es ist subtil, aber immer noch da.

Jede Hilfe wird gut angenommen.

Vielen Dank im Voraus.

! Ich habe keinen Code gepostet, da das Problem nicht da ist (es ruft nur [NSBezierPath fillRect:rect] mit roter Farbe auf), denke ich ... also habe ich nichts zu zeigen.

    
Francisco Adasme 09.12.2011, 16:12
quelle

1 Antwort

12

Ich habe das auch ausprobiert und bemerkt, dass drawSeparatorInRect: nur die untere Trennlinie zeichnen kann, da die Position der oberen Trennlinie (die der unteren Trennlinie der vorhergehenden Zeile entspricht) ein Pixel außerhalb ist ( oben) die clipRect der Zeile.

Ich habe es jedoch durch Unterklassenbildung von NSTableRowView und drawSeparatorInRect erhalten: wie folgt:

%Vor%

Diese Methode zeichnet (nur) ihre eigene untere Trennlinie. Wenn es sich um die ausgewählte Zeile handelt, zeichnet sie die Zeile nicht mit der Standardfarbe, sondern markiert, und teilt der vorherigen Zeile dann mit, dass sie ihre Trennlinie neu zeichnet, d. H. Genauso wie die oberste Trennlinie der ausgewählten Zeile.

Damit dies funktioniert, muss die Zeile über der ausgewählten Zeile ihre untere Trennlinie neu zeichnen, sobald sich die Auswahl bewegt. Ich habe dies erreicht, indem ich diese Methode im NSTableView-Delegaten verwendet habe:

%Vor%

Diese Delegatmethode weist die Zeile über der noch ausgewählten Zeile an, ihre Trennlinie neu zu zeichnen. Es wird unmittelbar vor der Änderung aufgerufen.

    
Tim 02.01.2012 22:52
quelle

Tags und Links