You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:22:22