2013-10-17 94 views
2

我遇到了一个问题,关于使用自定义NSTableHeaderCell清除NSTableView的背景。当我调整表格列。自定义NSTableHeaderCell NSTableView的清晰背景

enter image description here

// The method for setting NSTableView in some place 
// NSScrollView disabled Draw Background 
- (void)setMainTableView:(NSTableView *)mainTableView { 

    _mainTableView = mainTableView; 
    [_mainTableView setBackgroundColor:[NSColor clearColor]]; 

    [[_mainTableView tableColumns] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 

     NSString *columnTitle = [[obj headerCell] stringValue]; 
     MyTableHeaderCell *myCell = [[MyTableHeaderCell alloc] initTextCell:columnTitle]; 
     [obj setHeaderCell:myCell]; 
    }]; 
} 

// Overriding NSTableHeaderCell Method 
- (void)drawWithFrame:(CGRect)cellFrame inView:(NSView *)view { 

    [[NSColor redColor] set]; 
    NSFrameRect(cellFrame); 

    [super drawInteriorWithFrame:cellFrame inView:view]; 
} 

回答

1

任何以前的像素应该自动被任何绘图之前的API被清除。看来你发现只有在调整大小时才会发生故障。解决方法是自己清除像素。在绘制其他任何东西之前,只需用白色(或背景色)填充cellFrame矩形。

1

+1到拉杜

具体而言,对于任何人谁在乎..做这样的事情在你雨燕可以这样做:

final class MyTableHeaderCell : NSTableHeaderCell 
{ 
    required init?(coder aDecoder: NSCoder) 
    { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override init(textCell: String) 
    { 
     super.init(textCell: textCell) 
     // you can also set self.font = NSFont(...) here, too!   
    } 

    override func drawWithFrame(cellFrame: NSRect, inView controlView: NSView) 
    { 
     super.drawWithFrame(cellFrame, inView: controlView) // since that is what draws borders 
     NSColor().symplyBackgroundGrayColor().setFill() 
     NSRectFill(cellFrame) 
     self.drawInteriorWithFrame(cellFrame, inView: controlView) 
    } 

    override func drawInteriorWithFrame(cellFrame: NSRect, inView controlView: NSView) 
    { 
     let titleRect = self.titleRectForBounds(cellFrame) 
     self.attributedStringValue.drawInRect(titleRect) 
    } 
}