NSTableHeaderView adds a line?

1.4k views Asked by At

For my first Mac app, I'm trying to make a simple window with just a table view. I enabled Headers but it adds an annoying line on top of my NSTableHeaderView:

enter image description here

I can't seem to find a property to remove it. I know it can be removed, because the Finder doesn't have it:

enter image description here

When I disable Headers, the border is not there. I should also note that the NSTableView is located inside an NSSplitView. Any ideas?

2

There are 2 answers

2
gcbrueckmann On BEST ANSWER

The problem exists because both the window frame and the table view's scroll view have a 1px border. Depending on your layout you can either set the borderStyle of the NSScrollView that encloses your NSTableView to NSNoBorder (note that this will remove the 1px border from all sides of the scroll view). Or you can move the scroll view up by 1px.

0
Andrew On

Another solution is to:

  1. Subclass NSTableHeaderView
  2. Override -drawRect: to draw a 1pt white line horizontally across the top to match the table header view's background color.
  3. Instantiate an instance of the custom header view using -initWithFrame: passing in the existing headerView's frame.
  4. Assign the custom header view to the table view's headerView property.

Implementation of -drawRect::

- (void)drawRect:(NSRect)dirtyRect {
    // Allow the table header view to draw itself
    [super drawRect:dirtyRect];
     // Draw a 1pt white line across the width of the header view
    [[NSColor whiteColor] setFill];
    NSRectFill(NSMakeRect(0.0f, 0.0f, self.bounds.size.width, 1.0));
}

Or in Swift:

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)
    let topBorderBox = NSRect(x: 0, y: 0, width: bounds.size.width, height: 1)
    if dirtyRect.intersects(topBorderBox) {
        NSColor.white.setFill()
        topBorderBox.fill()
    }
}