Mac Catalyst: Toolbar still appears below title bar, leaving empty safe area

Hi everyone, I’m testing my Catalyst SwiftUI project on iOS 26 / iPadOS 26 / macOS 26. I started with a NavigationSplitView (triple-column) inside a WindowGroup. On iPad it looks great: the toolbar items merge into the navigation bar, with the three traffic lights. But on Mac Catalyst, the app always reserves a blank safe area below the traffic lights, and places the toolbar on a separate line beneath the title bar. That leaves wasted vertical space I don’t want.

What I expect (based on Apple’s WWDC session “Elevate the design of your iPad app”): The toolbar should merge into the title bar with the traffic lights, no separate row. Content should extend into the full height of the window. What I get on Mac Catalyst: Title bar + traffic lights at the top. Then a completely separate toolbar row below it. Safe area inset prevents my content from reaching the top of the window.

What I’ve tried: .toolbarRole(.automatic), .editor, .browser → no effect. Hiding the title bar via titlebar?.titleVisibility = .hidden → removes the text but not the toolbar gap. Clearing titlebar?.toolbar → no difference. So far, I can’t find any way to get Catalyst to integrate toolbars into the window chrome the way native SwiftUI on macOS does.

Is this a known limitation of Mac Catalyst, or is there a supported way to achieve the same “inline toolbar with window controls” layout? Switching to a Mac app vs. Catalyst fixes the issue, but I would have a lot more work to do to get the app ready for release, not ideal since it works near perfect on iPad.

Thanks!

I’ve been working on this for the past two days, but in a UIKit Mac Catalyst context. I managed to get it working, though I believe this might actually be a bug in Mac Catalyst. I was about to file a report when I came across your post. Did you already submit one?

The workaround I found is to assign an instance of NSToolbar to the windowScene's titlebar like this:

// Inside SceneDelegate.swift
#if targetEnvironment(macCatalyst)
let toolbar = NSToolbar()
toolbar.displayMode = .iconOnly // reduces toolbar height
self.window?.windowScene?.titlebar?.toolbar = toolbar
#endif

This setup gives you the unified sidebar and toolbar, but there’s still quite a bit of empty space at the top, even with displayMode set to .iconOnly. Since I didn’t actually need a toolbar in my case, I fixed it by applying a negative top safe area inset. That gave me the look I wanted:

let splitViewController = UISplitViewController(style: .doubleColumn)
let sidebarNavigationController = KNavigationController(rootViewController: SidebarViewController())

#if targetEnvironment(macCatalyst)
sidebarNavigationController.additionalSafeAreaInsets.top = -28 // roughly the titlebar height
splitViewController.additionalSafeAreaInsets.top = -28
#endif

splitViewController.setViewController(sidebarNavigationController, for: .primary)

Before

After

Mac Catalyst: Toolbar still appears below title bar, leaving empty safe area
 
 
Q