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