Come from: http://stackoverflow.com/questions/4753282/modifying-table-headers-on-mac
参考信息: http://www.paintcodeapp.com/examples.html
http://cocoatricks.com
首先,子类化NSTableHeaderCell
- @interface CNSTableHeaderCell : NSTableHeaderCell {
- }
- - (void)drawWithFrame:(CGRect)cellFrame
- highlighted:(BOOL)isHighlighted
- inView:(NSView *)view;
- @end
- @implementation CNSTableHeaderCell
- - (void)drawWithFrame:(CGRect)cellFrame
- highlighted:(BOOL)isHighlighted
- inView:(NSView *)view
- {
- CGRect cfillRect, cborderRect;
- NSBezierPath *path = [NSBezierPath bezierPath];
- NSPoint ptStart, ptEnd;
- //make two new rect from cellFrame
- //for instance,based on the fourth argument of CGRectDivide -- in this case is 1.0
- //cellFrame = (0,0,200,20),cfillRect = (0,0,200,20-1),cborderRect = (0,20-1,200,1)
- CGRectDivide(cellFrame, &cborderRect, &cfillRect, 1.0, CGRectMaxYEdge);
- //make NSRect from CGRect, and fill it with any color you like,in this case is blueColor
- NSRect fillRect = NSMakeRect(cfillRect.origin.x, cfillRect.origin.y, cfillRect.size.width, cfillRect.size.height);
- [[NSColor blueColor] set];
- NSRectFill(fillRect);
- //set highlight behavior
- if (isHighlighted)
- {
- [[NSColor colorWithDeviceWhite:0.0 alpha:0.1] set];
- NSRectFillUsingOperation(fillRect, NSCompositeSourceOver);
- }
- //set antialias to make text more smoothly
- [[NSGraphicsContext currentContext] setShouldAntialias:YES];
- //draw right vertical line for cell
- ptStart.x = fillRect.origin.x + fillRect.size.width - 1;
- ptStart.y = fillRect.origin.y;
- ptEnd.x = fillRect.origin.x + fillRect.size.width - 1;
- ptEnd.y = fillRect.origin.y + fillRect.size.height;
- [path moveToPoint:ptStart];
- [path lineToPoint:ptEnd];
- //draw cell bottom line
- ptStart.x = cellFrame.origin.x;
- ptStart.y = cellFrame.origin.y + cellFrame.size.height;
- ptEnd.x = cellFrame.origin.x + cellFrame.size.width;
- ptEnd.y = cellFrame.origin.y + cellFrame.size.height;
- [path moveToPoint:ptStart];
- [path lineToPoint:ptEnd];
- //draw cell top line
- ptStart.x = fillRect.origin.x;
- ptStart.y = fillRect.origin.y;
- ptEnd.x = fillRect.origin.x + fillRect.size.width;
- ptEnd.y = fillRect.origin.y;
- [path moveToPoint:ptStart];
- [path lineToPoint:ptEnd];
- //set line color and show line
- [[NSColor redColor] set];
- [path stroke];
- //finally draw interior
- [self drawInteriorWithFrame:fillRect inView:view];
- }
- //NSCell method
- - (void)drawWithFrame:(CGRect)cellFrame inView:(NSView *)view
- {
- [self drawWithFrame:cellFrame highlighted:NO inView:view];
- }
- //NSCell method
- - (void)highlight:(BOOL)isHighlighted
- withFrame:(CGRect)cellFrame
- inView:(NSView *)view
- {
- [self drawWithFrame:cellFrame highlighted:isHighlighted inView:view];
- }
- @end
然后,应用到tableview
- NSTableColumn *aColumn = nil;
- NSArray *arrTableColumns = [self tableColumns];
- for (int i = 0;i<[arrTableColumns count];i++)
- {
- aColumn = [arrTableColumns objectAtIndex:i];
- if ([[aColumn headerCell]class] == [NSTableHeaderCell class])
- {
- CNSTableHeaderCell *aHeaderCell = [[CNSTableHeaderCell alloc]
- initTextCell:[[aColumn headerCell] stringValue]];
- [aHeaderCell setFont:[NSFont fontWithName:@"Arial" size:13]];
- [aHeaderCell setTextColor:[NSColor whiteColor]];
- [aColumn setHeaderCell:aHeaderCell];
- [aHeaderCell release];
- }
- }
效果如图: