0

我写了一个基于视图的tableview,像这样: 在此处输入图像描述

我用 NSTableRowView 绘制选择,代码是这样的:

- (void)drawRect:(NSRect)dirtyRect {
  [[NSColor clearColor] setFill];
  if (self.isClicked) {
    [[[NSColor blackColor] colorWithAlphaComponent:0.08] setFill];
  }
  NSRect rowViewRect = NSMakeRect(0, 0, 274, 72);
  NSBezierPath *path = [NSBezierPath bezierPathWithRect:rowViewRect];
  [path fill];
}

但是最后我发现TableRowView并没有覆盖tableView,所以selectedColor没有覆盖图片和按钮,更像是背景色,但是我需要selectedTableRowView覆盖view,就像这样:

在此处输入图像描述

所选颜色覆盖图像和按钮。我用谷歌搜索,但没有找到任何想法。谢谢帮忙~

4

1 回答 1

1

所以这有点棘手。策略是在您的 NSTableCellView 中有一个 alpha 小于 1 的覆盖彩色视图,然后根据单元格的选择添加和删除它。

首先,你需要一个可以设置背景颜色的 NSView:

NSView_Background.h

@interface NSView_Background : NSView 
@property (nonatomic, strong) NSColor *background;
@end

NSView_Background.m

#import "NSView_Background.h"

@implementation NSView_Background

- (void)drawRect:(NSRect)dirtyRect {
    [self.background set];
    NSRectFill([self bounds]);
}

- (void)setBackground:(NSColor *)color {
    if ([_background isEqual:color]) return;

    _background = color;

    [self setNeedsDisplay:YES];
}
@end

其次,在您的 NSTableCellView 子类中,添加一个 NSView_Background 属性:

#import "NSView_Background.h"

@interface
@property (nonatomic, strong) NSView_Background *selectionView;
@end

第三,将此方法添加到 NSTableCellView 子类:

- (void)shouldShowSelectionView:(BOOL)shouldShowSelectionView {
    if (shouldShowSelectionView) {
        self.selectionView = [[NSView_Background alloc] init];
        [self.selectionView setBackground:[NSColor grayColor]];
        self.selectionView.alpha = 0.4;
        [self addSubview:self.selectionView];

        [self setNeedsDisplay:YES];   // draws the selection view
    } else {
        [self.selectionView removeFromSuperview];
        self.selectionView = nil;
    }
}

第四,将这个添加到你的 NSTableCellView 子类中的 drawRect 中:

- (void)drawRect:(NSRect)dirtyRect {
    if (self.selectionView)
        self.selectionView.frame = self.bounds;
}

最后,覆盖 NSTableCellView:setBackgroundStyle:

- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle {
    switch (backgroundStyle) {
        case: NSBackgroundStyleDark:
            [self shouldShowSelectionView:YES];
            break;
        default:
            [self shouldShowSelectionView:NO];
            break;
    }
}

我知道这看起来很老套,但这是我得到这种行为的唯一方法。希望这会有所帮助,祝你好运!

于 2016-04-25T20:13:19.547 回答