Mac开发云集iOS之MAC端开发程序员

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

2017-07-07  本文已影响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、注意事项:
①、这个方法不能设置自定义的图片
②、这个方法不能设置边框的颜色

上一篇下一篇

猜你喜欢

热点阅读