SwiftUI多WindowGroups非主窗口全屏时隐藏工具栏的实现方案
解决方案:SwiftUI非主窗口全屏自动隐藏工具栏
核心思路
SwiftUI原生的WindowGroup和工具栏相关API无法直接实现Preview应用的全屏自动隐藏工具栏行为,需要结合AppKit的NSWindow属性来控制。关键是设置窗口的fullScreenToolbarPresentationMode为.autohide,并配合合适的工具栏样式。
实现步骤
1. 自定义窗口修饰器获取NSWindow引用
创建一个自定义修饰器,用来获取当前视图对应的NSWindow实例:
struct WindowAccessor: NSViewRepresentable { var callback: (NSWindow?) -> Void func makeNSView(context: Context) -> NSView { let view = NSView() DispatchQueue.main.async { callback(view.window) } return view } func updateNSView(_ nsView: NSView, context: Context) {} } extension View { func withWindow(_ callback: @escaping (NSWindow?) -> Void) -> some View { self.background(WindowAccessor(callback: callback)) } }
2. 为非主窗口配置全屏工具栏行为
在非主窗口的WindowGroup根视图中,使用上述修饰器获取窗口并设置对应属性:
// 非主窗口的WindowGroup WindowGroup("Secondary Window") { SecondaryView() .presentedWindowToolbarStyle(.unified) .windowStyle(.titleBar) .withWindow { window in guard let window = window else { return } // 开启全屏工具栏自动隐藏 window.fullScreenToolbarPresentationMode = .autohide // 匹配Preview的工具栏紧凑样式 window.toolbarStyle = .unifiedCompact } }
3. 仅对非主窗口生效的判断逻辑
如果需要确保主窗口不受影响,可通过窗口的isMainWindow属性做区分:
.withWindow { window in guard let window = window, !window.isMainWindow else { return } window.fullScreenToolbarPresentationMode = .autohide window.toolbarStyle = .unifiedCompact }
关键说明
fullScreenToolbarPresentationMode的.autohide模式会让工具栏在全屏状态下自动隐藏,鼠标移至屏幕顶部时才会显示,完全匹配Preview应用的行为。.unifiedCompact工具栏样式能让全屏时的工具栏折叠效果更贴近Preview的视觉表现。- 该方案直接操作AppKit底层窗口属性,避开了SwiftUI原生API的局限性,同时保留了SwiftUI视图的声明式风格。
内容的提问来源于stack exchange,提问作者Zhich
相关产品推荐
相关产品推荐

