如何在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子类:
- 创建自定义窗口类
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 } }
- 在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
相关产品推荐
相关产品推荐

