2011-12-28 11 views
6

I colori di riga alternati personalizzati sono disponibili nel NSTableView basato su visualizzazione, sostituendo NSTableRowView di -drawBackgroundInRect:. Ciò funziona per la maggior parte in quanto i colori delle celle cambiano, ma ovviamente non influisce sullo sfondo della vista tabella stessa (ad esempio quando la vista di scorrimento viene rimbalzata). Screenshot:Sfondo personalizzato in NSTableView basato su visualizzazione

NSTableView background

Qual è il modo migliore per personalizzare questo? I posted a question in precedenza su questo stesso problema ma con visualizzazioni tabella basata su cella. La soluzione che ho trovato non sembra funzionare con le visualizzazioni delle tabelle basate su viste.

+0

Vuoi background per essere alternato troppo? – lbrndnr

+0

Sì, con gli stessi colori che utilizzo per le celle – indragie

+0

Perché non provi a replicare le righe vuote in drawBackgroundInClipRect? NSTableView lo sta disegnando anche in questo metodo e non sembra difficile. – lbrndnr

risposta

3

Hai provato l'override del NSTableView drawBackgroundInClipRect:(NSRect)clipRect

-1

Non ho provato, ma cosa succede se semplicemente ignorare -drawRect:?

+2

-drawRect: non è pensato per essere sovrascritto in una sottoclasse NSTableView, questo produrrebbe probabilmente risultati indesiderati. – indragie

2

C'è un video del talk "Visualizza basato su NSTableView Basic to Advanced" (disponibile here) in cui viene disegnato lo sfondo sotto l'ultima riga.

Al fine di estendere questa tecnica, è possibile creare una sottoclasse di NSTableView e aggiungere un po 'di codice:

// somewhere in your setup code (colors just intended as examples): 

tableView.colors = [NSArray arrayWithObjects: [NSColor lightGrayColor],[NSColor grayColor], nil]; 


// In the table view subclass: 

-(void)drawBackgroundInClipRect:(NSRect)clipRect 
{ 
    // The super class implementation obviously does something more 
    // than just drawing the striped background, because 
    // if you leave this out it looks funny 
    [super drawBackgroundInClipRect:clipRect]; 

    NSRect boundsToDraw = clipRect; 

    CGFloat yStart = 0; 
    NSInteger rowIndex = -1; 

    if (clipRect.origin.y < 0) {   

     while (yStart > NSMinY(boundsToDraw)) { 

      CGFloat yRowTop = yStart - self.rowHeight; 

      NSRect rowFrame = NSMakeRect(0, yRowTop, boundsToDraw.size.width, self.rowHeight); 

      NSUInteger colorIndex = rowIndex % self.colors.count; 

      NSColor *color = [self.colors objectAtIndex:colorIndex]; 

      [color set]; 

      NSRectFill(rowFrame); 

      yStart -= self.rowHeight; 

      rowIndex--; 
     } 
    } 
}