Esta es mi primera pregunta aquí, y trataré de hacerlo lo más claro posible.NSTableView: Cómo dibujar un separador personalizado antes y después de una fila seleccionada
Quiero dibujar un degradado personalizado en una fila seleccionada en un NSTableView basado en vista, mientras agrego un sutil efecto elevado. Para esto, necesito usar un color más oscuro para las líneas de cuadrícula que están antes y después de la fila seleccionada (ver here para ver un ejemplo). He pasado por alto el método drawSeparatorInRect:
en NSTableRowView para dibujar la línea separadora personalizada para la fila seleccionada (usando el método isSelected
como indicador), pero no puedo hacer lo mismo para la anterior/inferior (ya que dibujo la línea en la parte inferior/parte superior).
He intentado varias formas de decir a la fila más cercana que debería dibujar una línea de separación más oscura sin éxito ya que el paso de visualización no sigue el mismo orden (lo comprobé con NSLogs en el drawSeparatorInRect:
, y parece que cuando te desplazas un poco esta orden cambia). Por lo tanto, a veces (principalmente después del desplazamiento) la fila no sabe que debe usar un color más oscuro ya que se dibuja antes que el seleccionado (creo que en este punto, la fila seleccionada aún no sabe que está seleccionada, de lo contrario, no entiendo lo que está pasando).
Algunas de las cosas que intenté:
- En el método de la fila seleccionada
drawSeparatorInRect:
, me han tratado de acceder a los puntos de vista hermanos ([superview subviews]
) y obligar a la anterior/siguiente para dibujarse a sí mismo de nuevo. - Desde la subclase
NSTableView
, modifique directamente la fila más cercana cuando cambie selectedIndexes. - Dibujando la línea fuera de la fila seleccionada dentro de su método
drawSeparatorInRect:
como se muestra here.
Tenga en cuenta que hice esto tiene: una vista de primera fila preguntando si se selecciona la anterior/siguiente, un closestRowIsSelected bandera o llamando externamente un método para "forzar" el color oscuro.
Lo que tengo ahora es que la fila seleccionada dibuja los bordes superior e inferior, por lo que uno de ellos se coloca junto a la línea de la fila anterior/siguiente ... Es sutil, pero todavía está allí.
Cualquier ayuda será bien recibida.
Gracias de antemano.
! No publiqué ningún código porque el problema no existe (simplemente llama al [NSBezierPath fillRect:rect]
con color rojo), creo ... así que no tengo nada que mostrar.
En realidad, la documentación de Apple resultó ser la correcta: el comportamiento predeterminado de NSTableRowView es dibujar la línea de separación en la parte inferior de la fila, no en la parte superior. He editado el ejemplo de código anterior en consecuencia. – Tim
Muchas gracias, ciertamente hace lo que estaba tratando de hacer. Sin embargo, cada vez que selecciono una fila o desplazo la vista de tabla, la fila anterior a la seleccionada se redibuja varias veces, lo que produce un texto ultra audaz y otros efectos extraños. ¿Me he perdido algo? –
Lo tengo funcionando perfectamente con mi código anterior. Sin embargo, moví la pieza de código que obliga a la vista de celda anterior a dibujarse, ubicada al final del método 'drawSeparatorInRect:', en un método delegado que me da la nueva fila seleccionada (utilicé 'tableView: shouldSelectRow:') . De nuevo, gracias por tu asistencia. –