
十里(5km)macOS 开发
macOS 开发 - macOS 26 中隐藏主窗口标题栏
在最新的 macOS 里,仅仅 .windowStyle(.hiddenTitleBar) 有时不够✨。把窗口容器背景设为透明:containerBackground(.clear, for: .window),或再配上必要的 toolbar 调整🛠️,才能真正做到“无标题栏”🎯。
739次点击2分钟阅读
背景
升级到 macOS 26 与 Xcode 16 后,我在适配 Zipic 的主窗口上遇到一个微妙变化:
- 传统做法
Window { ... }.windowStyle(.hiddenTitleBar)在某些布局下无法完全去掉标题栏的“背板/留白”。 - 栈内如果还有 toolbar 的标题或背景,它会“顽强地”把顶部那一条视觉层带回来。
标题栏无法隐藏的 zipic 主窗口
解决关键在于:为整个窗口容器设置透明背景,让内容真正延伸到窗口最上缘。
最小可行方案(精简示例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19@main struct ZipicApp: App { var body: some Scene { Window("Zipic", id: "Zipic") { RootView() // 关键:让窗口容器背景透明,内容通顶 .containerBackground(.clear, for: .window) // 可选:移除工具栏标题,避免系统“又把标题救回来” .toolbar(removing: .title) // 可选:隐藏工具栏背景,获得纯净的无缝顶部 .toolbarBackgroundVisibility(.hidden, for: .windowToolbar) // 你的其它布局、状态逻辑... } // 仍然保留隐藏标题栏样式 .windowStyle(.hiddenTitleBar) // 无标题栏后,允许在背景直接拖动窗口(体验细节) .windowBackgroundDragBehavior(.enabled) } }
上面保留了.hiddenTitleBar,但“真正让内容通顶的是”.containerBackground(.clear, for: .window)。
Zipic 中的实际写法(聚焦关键差异)
在 Zipic 的主窗口里,我们对 macOS 15 及以上 增加了容器背景透明:
ZipicApp.swift
1 2 3 4 5 6 7 8 9 10 11 12Window("Zipic", id: "Zipic") { if #available(macOS 15.0, *) { ContentView(...) .containerBackground(.clear, for: .window) .ignoresSafeArea(.all) // 其余尺寸、状态更新略 } else { ContentView(...) .ignoresSafeArea(.all) } } .windowStyle(.hiddenTitleBar)
此改动就是触发“通顶”的关键;其余如 toolbar(removing: .title)、toolbarBackgroundVisibility(.hidden, for: .windowToolbar) 可根据你是否使用到 NavigationSplitView、.navigationTitle 再按需加。
最终效果
完美隐藏标题栏的 Zipic 主窗口
踩坑 & 排查清单
- 把修饰符放在创建该窗口的 Scene 上(
Window/WindowGroup),别贴错层级。 - 界面里若存在隐式的 toolbar 标题(如
NavigationSplitView默认提供的),可移除:.toolbar(removing: .title)。 - 去掉标题栏后,启用背景拖拽:
.windowBackgroundDragBehavior(.enabled),否则用户可能无处拖动。 - 预览不一定反映最终外观,以真机/真应用运行为准。
结语
SwiftUI 在 macOS 这两年给了更多“窗口级”的能力。换句话说:标题栏不再是“你改不动的那条线”。用好 containerBackground(for: .window) 与 toolbar 系列 API,你可以更容易实现视觉统一、半透明毛玻璃、定制化的悬浮窗体验。



