重绘NSTableHeaderCell(在NSTableView中)

Come from: http://stackoverflow.com/questions/4753282/modifying-table-headers-on-mac

参考信息: http://www.paintcodeapp.com/examples.html

  http://cocoatricks.com

首先,子类化NSTableHeaderCell

[cpp]  view plain copy
  1. @interface CNSTableHeaderCell : NSTableHeaderCell {  
  2.   
  3. }  
  4.   
  5. - (void)drawWithFrame:(CGRect)cellFrame  
  6.           highlighted:(BOOL)isHighlighted  
  7.                inView:(NSView *)view;  
  8. @end  

[cpp]  view plain copy
  1. @implementation CNSTableHeaderCell  
  2.   
  3. - (void)drawWithFrame:(CGRect)cellFrame  
  4.           highlighted:(BOOL)isHighlighted  
  5.                inView:(NSView *)view  
  6. {  
  7.     CGRect cfillRect, cborderRect;  
  8.     NSBezierPath *path = [NSBezierPath bezierPath];  
  9.     NSPoint ptStart, ptEnd;  
  10.       
  11.     //make two new rect from cellFrame  
  12.     //for instance,based on the fourth argument of CGRectDivide -- in this case is 1.0  
  13.     //cellFrame = (0,0,200,20),cfillRect = (0,0,200,20-1),cborderRect = (0,20-1,200,1)  
  14.     CGRectDivide(cellFrame, &cborderRect, &cfillRect, 1.0, CGRectMaxYEdge);  
  15.       
  16.     //make NSRect from CGRect, and fill it with any color you like,in this case is blueColor  
  17.     NSRect fillRect = NSMakeRect(cfillRect.origin.x, cfillRect.origin.y, cfillRect.size.width, cfillRect.size.height);  
  18.     [[NSColor blueColor] set];  
  19.     NSRectFill(fillRect);  
  20.       
  21.     //set highlight behavior  
  22.     if (isHighlighted)   
  23.     {  
  24.         [[NSColor colorWithDeviceWhite:0.0 alpha:0.1] set];  
  25.         NSRectFillUsingOperation(fillRect, NSCompositeSourceOver);  
  26.     }  
  27.       
  28.     //set antialias to make text more smoothly  
  29.     [[NSGraphicsContext currentContext] setShouldAntialias:YES];  
  30.       
  31.     //draw right vertical line for cell  
  32.     ptStart.x = fillRect.origin.x + fillRect.size.width - 1;  
  33.     ptStart.y = fillRect.origin.y;  
  34.       
  35.     ptEnd.x = fillRect.origin.x + fillRect.size.width - 1;  
  36.     ptEnd.y = fillRect.origin.y + fillRect.size.height;  
  37.     [path moveToPoint:ptStart];  
  38.     [path lineToPoint:ptEnd];  
  39.       
  40.     //draw cell bottom line  
  41.     ptStart.x = cellFrame.origin.x;  
  42.     ptStart.y = cellFrame.origin.y + cellFrame.size.height;  
  43.     ptEnd.x = cellFrame.origin.x + cellFrame.size.width;  
  44.     ptEnd.y = cellFrame.origin.y + cellFrame.size.height;  
  45.     [path moveToPoint:ptStart];  
  46.     [path lineToPoint:ptEnd];  
  47.       
  48.     //draw cell top line  
  49.     ptStart.x = fillRect.origin.x;  
  50.     ptStart.y = fillRect.origin.y;  
  51.     ptEnd.x = fillRect.origin.x + fillRect.size.width;  
  52.     ptEnd.y = fillRect.origin.y;  
  53.     [path moveToPoint:ptStart];  
  54.     [path lineToPoint:ptEnd];  
  55.       
  56.     //set line color and show line  
  57.     [[NSColor redColor] set];  
  58.     [path stroke];  
  59.       
  60.     //finally draw interior  
  61.     [self drawInteriorWithFrame:fillRect inView:view];  
  62. }  
  63.   
  64. //NSCell method  
  65. - (void)drawWithFrame:(CGRect)cellFrame inView:(NSView *)view  
  66. {  
  67.     [self drawWithFrame:cellFrame highlighted:NO inView:view];  
  68. }  
  69.   
  70. //NSCell method  
  71. - (void)highlight:(BOOL)isHighlighted  
  72.         withFrame:(CGRect)cellFrame  
  73.            inView:(NSView *)view  
  74. {  
  75.     [self drawWithFrame:cellFrame highlighted:isHighlighted inView:view];  
  76. }  
  77.   
  78. @end  

然后,应用到tableview

[cpp]  view plain copy
  1. NSTableColumn *aColumn = nil;  
  2. NSArray *arrTableColumns = [self tableColumns];  
  3. for (int i = 0;i<[arrTableColumns count];i++)  
  4. {  
  5.     aColumn = [arrTableColumns objectAtIndex:i];  
  6.     if ([[aColumn headerCell]class] == [NSTableHeaderCell class])   
  7.     {  
  8.         CNSTableHeaderCell *aHeaderCell = [[CNSTableHeaderCell alloc]  
  9.                                            initTextCell:[[aColumn headerCell] stringValue]];  
  10.         [aHeaderCell setFont:[NSFont fontWithName:@"Arial" size:13]];  
  11.         [aHeaderCell setTextColor:[NSColor whiteColor]];  
  12.         [aColumn setHeaderCell:aHeaderCell];  
  13.         [aHeaderCell release];  
  14.     }  
  15. }  


效果如图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值