SwiftUI设置窗口样式修改异常:常规窗口生效,设置窗口无效
macOS SwiftUI Settings窗口样式修改方案
直接在Settings或其内部视图上调用.windowStyle、.windowToolbarStyle无效,是因为系统对Settings窗口的配置逻辑和普通窗口不同。以下是两种可靠的解决方法:
方法一:通过窗口标识定位并修改样式
给Settings场景设置唯一标识,在视图加载时找到对应窗口修改样式:
@main struct YourApp: App { var body: some Scene { WindowGroup { ContentView() } // 给Settings场景设置窗口标识 Settings { SettingsView() .onAppear { // 通过标识找到Settings窗口 guard let settingsWindow = NSApplication.shared.windows.first(where: { $0.identifier?.rawValue == "CustomSettingsWindow" }) else { return } // 设置标题栏样式 settingsWindow.toolbarStyle = .unified // 设置窗口样式掩码,保留标题栏、可关闭、可调整大小 settingsWindow.styleMask = [.titled, .closable, .resizable] // 可选:设置标题栏透明 // settingsWindow.titlebarAppearsTransparent = true // settingsWindow.titleVisibility = .hidden } } .windowIdentifier("CustomSettingsWindow") } } struct SettingsView: View { var body: some View { Text("你的设置内容") } }
方法二:通过AppDelegate监听窗口创建
适合需要全局控制窗口配置的场景:
- 创建AppDelegate类和窗口代理,监听Settings窗口创建事件:
import Cocoa import SwiftUI class AppDelegate: NSObject, NSApplicationDelegate { func application(_ application: NSApplication, didFinishLaunchingWithOptions launchOptions: [NSApplication.LaunchOptionsKey : Any]? = nil) -> Bool { return true } } // 自定义Settings窗口代理 class SettingsWindowDelegate: NSObject, NSWindowSceneDelegate { func windowScene(_ windowScene: NSWindowScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // 判断当前场景为Settings场景 guard session.role == .settings, let window = windowScene.windows.first else { return } // 配置窗口样式 window.toolbarStyle = .unified window.styleMask = [.titled, .closable, .resizable] } }
- 在App结构体中关联代理并绑定到Settings场景:
@main struct YourApp: App { @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate var body: some Scene { WindowGroup { ContentView() } Settings { SettingsView() } .windowSceneDelegate(SettingsWindowDelegate.self) } }
注意:以上方法适用于macOS 13及以上版本,低版本系统部分API需调整。
内容的提问来源于stack exchange,提问作者JaggerJo
相关产品推荐
相关产品推荐

