基于视图的NSTableView中的自定义背景

时间:2011-12-28 22:26:33

标签: objective-c cocoa nstableview nsscrollview

我在基于视图的NSTableView中通过覆盖NSTableRowView的{​​{1}}来自定义交替行颜色。这在很大程度上起作用,因为单元格本身的颜色会发生变化,但它显然不会影响表格视图本身的背景(例如,当滚动视图被弹回时)。截图:

NSTableView background

定制此内容的最佳方法是什么?我posted a question之前关于这个问题但是使用基于单元格的表格视图。我找到的解决方案似乎不适用于基于视图的表视图。

3 个答案:

答案 0 :(得分:3)

您是否尝试覆盖NSTableView的drawBackgroundInClipRect:(NSRect)clipRect

答案 1 :(得分:2)

有一段视频“基于视图的NSTableView Basic to Advanced”(可用here),其中绘制了最后一行下方的背景。

为了扩展该技术,您可以创建NSTableView的子类并添加一些代码:

// 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--;
        }
    }
}

答案 2 :(得分:-1)

我没试过但如果你只是覆盖-drawRect会发生什么:?