NSTableView的默認(rèn)選中行顏色是藍(lán)色的背景色,這就不可避免得涉及到自定義NSTableView選中行背景的需求。接下來我就介紹一下兩種解決方法穴豫,以及需要注意的地方怀大。
方法一:繼承NSTableRowView
1纱兑、新建一個(gè)NSTableRowView的子類,重寫- (void)drawSelectionInRect:(NSRect)dirtyRect的方法:
//直接改變點(diǎn)擊背景色的方法
- (void)drawSelectionInRect:(NSRect)dirtyRect
{
if (self.selectionHighlightStyle != NSTableViewSelectionHighlightStyleNone) {
NSRect selectionRect = NSInsetRect(self.bounds, 1, 1);
[[NSColor colorWithWhite:0.9 alpha:1] setStroke]; //設(shè)置邊框顏色
[[NSColor redColor] setFill]; //設(shè)置填充背景顏色
NSBezierPath *path = [NSBezierPath bezierPathWithRect:selectionRect];
[path fill];
[path stroke];
}
}
//點(diǎn)擊cell呈現(xiàn)自定義圖片的方法
- (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化借、實(shí)現(xiàn)協(xié)議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潜慎、注意事項(xiàng):
①、最好不要在控制器中設(shè)置tableView的selectionHighlightStyle。如果設(shè)置為NSTableViewSelectionHighlightStyleNone勘纯,不會(huì)有點(diǎn)擊效果局服;如果設(shè)置為NSTableViewSelectionHighlightStyleRegular,可以正常顯示自定義的背景驳遵;如果設(shè)置為NSTableViewSelectionHighlightStyleSourceList淫奔,drawSelectionInRect的方法將不會(huì)執(zhí)行。所以還是建議既然你想自定義背景堤结,就不要在在控制器中設(shè)置tableView的selectionHighlightStyle了唆迁。
②、不要在自定義NSTableCellView的子類中設(shè)置self.layer.backgroundColor竞穷,這個(gè)屬性也將導(dǎo)致自定義的背景不生效唐责。
方法二:繼承NSTableCellView
1、新建一個(gè)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鼠哥、注意事項(xiàng):
①、這個(gè)方法不能設(shè)置自定義的圖片
②看政、這個(gè)方法不能設(shè)置邊框的顏色