NSTableHeaderView adds a line?
-
08-03-2021 - |
Frage
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
:
I can't seem to find a property to remove it. I know it can be removed, because the Finder doesn't have it:
When I disable Headers, the border is not there. I should also note that the NSTableView
is located inside an NSSplitView
. Any ideas?
Lösung
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.
Andere Tipps
Another solution is to:
- Subclass
NSTableHeaderView
- Override
-drawRect:
to draw a 1pt white line horizontally across the top to match the table header view's background color. - Instantiate an instance of the custom header view using
-initWithFrame:
passing in the existingheaderView
's frame. - 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()
}
}