美文网首页Mac开发云集iOS之MAC端开发程序员
MAC开发--自定义NSTableView选中行背景

MAC开发--自定义NSTableView选中行背景

作者: 背靠背的微笑 | 来源:发表于2017-07-07 11:53 被阅读564次

    NSTableView的默认选中行颜色是蓝色的背景色,这就不可避免得涉及到自定义NSTableView选中行背景的需求。接下来我就介绍一下两种解决方法,以及需要注意的地方。

    方法一:继承NSTableRowView

    1、新建一个NSTableRowView的子类,重写- (void)drawSelectionInRect:(NSRect)dirtyRect的方法:

    //直接改变点击背景色的方法
    - (void)drawSelectionInRect:(NSRect)dirtyRect
    {
        if (self.selectionHighlightStyle != NSTableViewSelectionHighlightStyleNone) {
            
            NSRect selectionRect = NSInsetRect(self.bounds, 1, 1);
            
            [[NSColor colorWithWhite:0.9 alpha:1] setStroke];  //设置边框颜色
            [[NSColor redColor] setFill];  //设置填充背景颜色
            
            NSBezierPath *path = [NSBezierPath bezierPathWithRect:selectionRect];
            [path fill];
            [path stroke];
        }
    }
    
    //点击cell呈现自定义图片的方法
    - (void)drawSelectionInRect:(NSRect)dirtyRect
    {
        if (self.selectionHighlightStyle != NSTableViewSelectionHighlightStyleNone)
        {
            
            NSImage *image = [NSImage imageNamed:@"选中"];
            NSImageRep *imageRep = image.representations[0];
            NSRect fromRect = NSMakeRect(0, 0, imageRep.size.width, imageRep.size.height);
            [imageRep drawInRect:dirtyRect fromRect:fromRect operation:NSCompositingOperationSourceOver fraction:1.0 respectFlipped:YES hints:nil];
        }
    }
    

    2、实现协议NSTableViewDelegate的- (NSTableRowView )tableView:(NSTableView )tableView rowViewForRow:(NSInteger)row代理方法:

    //指定自定义的行
    - (nullable NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row
    {
        CustomTableRowView *rowView = [tableView makeViewWithIdentifier:@"rowView" owner:self];
        if (!rowView) {
            
            rowView = [[CustomTableRowView alloc] init];
            rowView.identifier = @"rowView";
        }
        return rowView;
    }
    

    3、注意事项:
    ①、最好不要在控制器中设置tableView的selectionHighlightStyle。如果设置为NSTableViewSelectionHighlightStyleNone,不会有点击效果;如果设置为NSTableViewSelectionHighlightStyleRegular,可以正常显示自定义的背景;如果设置为NSTableViewSelectionHighlightStyleSourceList,drawSelectionInRect的方法将不会执行。所以还是建议既然你想自定义背景,就不要在在控制器中设置tableView的selectionHighlightStyle了。
    ②、不要在自定义NSTableCellView的子类中设置self.layer.backgroundColor,这个属性也将导致自定义的背景不生效。

    方法二:继承NSTableCellView

    1、新建一个NSTableCellView的子类,重写- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle方法:

    -(void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle
    {
        [super setBackgroundStyle:backgroundStyle];
        if(backgroundStyle == NSBackgroundStyleDark)
        {
            self.layer.backgroundColor = [NSColor yellowColor].CGColor;
        }
        else
        {
            self.layer.backgroundColor = [NSColor whiteColor].CGColor;
        }
    }
    

    2、注意事项:
    ①、这个方法不能设置自定义的图片
    ②、这个方法不能设置边框的颜色

    相关文章

      网友评论

        本文标题:MAC开发--自定义NSTableView选中行背景

        本文链接:https://www.haomeiwen.com/subject/jhrlhxtx.html