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

如何在AppKit SwiftUI中隐藏关闭、最小化和全屏按钮

在macOS SwiftUI中禁用/隐藏窗口交通灯按钮的方案

方案一:彻底隐藏交通灯按钮

如果需要完全移除关闭、最小化和调整大小按钮,可以通过修改NSWindow的样式掩码实现:

var body: some Scene {
    WindowGroup {
        ContentView(container: environment.container)
    }
    #if canImport(AppKit)
    .windowStyle(.hiddenTitleBar)
    .onAppear {
        NSApplication.shared.windows.forEach { window in
            // 移除对应按钮的样式标识
            window.styleMask.remove(.closable)
            window.styleMask.remove(.miniaturizable)
            window.styleMask.remove(.resizable)
            // 可选:固定窗口大小,防止用户拖动调整
            window.minSize = NSSize(width: 800, height: 600)
            window.maxSize = window.minSize
        }
    }
    #endif
}

方案二:保留按钮但禁用交互

如果只想让按钮不可点击而非隐藏,直接修改窗口的可用性属性即可:

var body: some Scene {
    WindowGroup {
        ContentView(container: environment.container)
    }
    #if canImport(AppKit)
    .windowStyle(.hiddenTitleBar)
    .onAppear {
        NSApplication.shared.windows.forEach { window in
            window.isClosable = false
            window.isMiniaturizable = false
            window.isResizable = false
            // 可选:固定窗口大小
            window.minSize = NSSize(width: 800, height: 600)
            window.maxSize = window.minSize
        }
    }
    #endif
}

方案三:自定义NSWindow子类(更稳定的长期方案)

对于复杂的窗口定制,推荐封装自定义NSWindow子类:

  1. 创建自定义窗口类
import AppKit

class CustomTrafficLightWindow: NSWindow {
    override func awakeFromNib() {
        super.awakeFromNib()
        // 隐藏按钮
        styleMask.remove(.closable)
        styleMask.remove(.miniaturizable)
        styleMask.remove(.resizable)
        // 保持窗口可拖动
        isMovable = true
        // 固定尺寸
        minSize = NSSize(width: 800, height: 600)
        maxSize = minSize
    }
}
  1. 在App中关联自定义窗口
@main
struct YourApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
    var body: some Scene {
        WindowGroup {
            ContentView(container: environment.container)
        }
        #if canImport(AppKit)
        .windowStyle(.hiddenTitleBar)
        #endif
    }
}

class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationDidFinishLaunching(_ notification: Notification) {
        guard let defaultWindow = NSApplication.shared.windows.first else { return }
        let customWindow = CustomTrafficLightWindow(contentRect: defaultWindow.frame,
                                                    styleMask: defaultWindow.styleMask,
                                                    backing: .buffered,
                                                    defer: false)
        customWindow.contentView = defaultWindow.contentView
        customWindow.makeKeyAndOrderFront(nil)
        defaultWindow.close()
    }
}

注意:使用.hiddenTitleBar样式后,交通灯按钮默认会保留在窗口左上角,以上方案均需配合该样式完成最终效果。如果需要窗口保持可拖动性,确保isMovable属性为true即可。

内容的提问来源于stack exchange,提问作者Cuong Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:20:21