I came across a strange macOS Tahoe bug when working on an AppKit app with a table. I managed to find a workaround, but since I was unable to find any solutions online, I thought I would post my discoveries in case they could help others.

The issue is that the content rows scroll into the header unless the table stretches to the bottom of the content view.

Full write-up here but one workaround is to add space at the top of the table as well: https://troz.net/post/2026/appkit-table-scroll-bug-in-macos-tahoe/

#AppKit #macOS

@troz Liquid Glass — the gift that keeps on giving.

@troz I just solved something different, but what feels like might have been caused by whatever the same underlying issue is.

In my case, it was a table view inside a sidebar whose content scrolled up underneath the toolbar without the toolbar applying a blur. The culprit was that the enclosing scroll view had a border type chosen. Changing the scroll view to no border made the toolbar render a blur correctly over the table view content. 🤷‍♂️

@bwebster Sounds like the same issue. I found removing the scroll view border worked for my case too. I just didn’t want that.

@troz There are a lot of little 1px shifts to get around issues like this. NSCollectionView now stick their sticky headers as a floating subview in its parent scroll view (not documented, but completely messes up layouts).

Other things that also screw up sticky headers and weird layouts is responsive scrolling, have to disable that or layout fails with anything sticky most of the time.

@troz
I hit this bug too, with space below my table. I found I could workaround by subclassing NSTableHeaderView and override draw(_:) but simply calling super. That seemed to make the header view nearly opaque again.

class OpaqueTableHeaderView: NSTableHeaderView {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
}