Questa è la mia prima domanda qui, e cercherò di farlo il più chiaro possibile.NSTableView: come disegnare una separatori personalizzati prima e dopo una riga selezionata
voglio disegnare un gradiente personalizzato su una riga selezionata in un NSTableView in base alla vista, mentre l'aggiunta di un effetto a rilievo sottile. Per questo, ho bisogno di usare un colore più scuro per le linee della griglia che sono prima e dopo la riga selezionata (vedi here per un esempio). Ho annullato il metodo in NSTableRowView per disegnare la linea di separazione personalizzata per la riga selezionata (utilizzando il metodo isSelected
come bandiera), ma non posso fare lo stesso per quello sopra/sotto (poiché disegno la linea in basso/superiore).
Ho provato diversi modi per dire alla riga più vicina che dovrebbe disegnare una linea di separazione più scura senza successo poiché la fase di visualizzazione non segue lo stesso ordine (l'ho verificata con NSlog nel drawSeparatorInRect:
, e sembra che quando si scorre un po 'le modifiche di questo ordine). Quindi, a volte (principalmente dopo lo scorrimento) la riga non sa che dovrebbe usare un colore più scuro poiché si disegna prima di quella selezionata (penso che a questo punto, la riga selezionata non sia ancora consapevole che è selezionata, altrimenti io non capisco cosa sta succedendo).
Alcune delle cose che ho provato:
- Nel metodo della riga selezionata
drawSeparatorInRect:
, ho cercato di accedere alle viste fratelli ([superview subviews]
) e forzare il precedente/successiva disegnare stessa nuovamente. - Dalla sottoclasse
NSTableView
, modificare direttamente la riga più vicina quando la modifica selezionataIndexes cambia. - Disegnare la linea esterna della riga selezionata dall'interno suo metodo
drawSeparatorInRect:
come mostra here.
noti che ho fatto avente: una fila vista chiede se è selezionata la precedente/successiva, un closestRowIsSelected bandiera o chiamando esternamente un metodo per "forza" il colore scuro.
Quello che ho ora è che la riga selezionata disegna entrambi i bordi superiore e inferiore, quindi uno di essi è posizionato insieme alla riga precedente/successiva ... È sottile ma è ancora lì.
Qualsiasi aiuto sarà ben accolto.
Grazie in anticipo.
! non ho postato alcun codice dal momento che il problema non è lì (solo chiamate [NSBezierPath fillRect:rect]
con il colore rosso), credo ... quindi non ho nulla da mostrare.
In realtà la documentazione di Apple risulta essere corretta: il bevaviour predefinito di NSTableRowView consiste nel disegnare la linea di separazione nella parte inferiore della riga, non nella parte superiore. Ho modificato l'esempio di codice sopra di conseguenza. – Tim
Grazie mille, fa sicuramente quello che stavo cercando di fare. Tuttavia, ogni volta che seleziono una riga o scorro la vista tabella, la riga da precedente a selezionata si ridisegna più volte, producendo un testo ultra-grassetto e altri effetti strani. Ho dimenticato qualcosa? –
Ho funzionato perfettamente con il mio vecchio codice. Tuttavia, ho spostato la parte di codice che forza la visualizzazione della cella precedente a disegnarsi, situata alla fine del metodo 'drawSeparatorInRect:', a un metodo delegato che mi dà la nuova riga selezionata (ho usato 'tableView: shouldSelectRow:') . Ancora una volta, grazie per il vostro aiuto. –