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

Posted

技术标签:

【中文标题】基于视图的 NSTableView 中的自定义背景【英文标题】:Custom background in view-based NSTableView 【发布时间】:2011-12-28 22:26:32 【问题描述】:

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

自定义它的最佳方式是什么?我之前posted a question 也遇到过同样的问题,但使用的是基于单元格的表格视图。我找到的解决方案似乎不适用于基于视图的表格视图。

【问题讨论】:

你也想要背景交替吗? 是的,使用与单元格相同的颜色 你为什么不尝试复制drawBackgroundInClipRect中的空行? NSTableView 也是用这个方法画的,好像不难。 【参考方案1】:

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

【讨论】:

【参考方案2】:

有一个演讲视频“基于视图的 NSTableView 基础到高级”(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--;
        
    

【讨论】:

【参考方案3】:

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

【讨论】:

-drawRect: 并不意味着在 NSTableView 子类中被覆盖,这可能会产生不需要的结果。

以上是关于基于视图的 NSTableView 中的自定义背景的主要内容,如果未能解决你的问题,请参考以下文章

NSTableview 中选定行的标签颜色

为 NSTableView 单元格绘制带有边框和背景的文本

基于视图的 NSTableView 中的 NSPopupButton

Cocoa osx NSTableview 改变行高亮颜色

将分隔符颜色更改为背景或从NSTableView中删除它

正确调整基于视图的 NSTableView 上的行大小