如何让SwiftUI macOS App每次启动时固定初始窗口大小?
解决macOS SwiftUI App启动固定初始窗口尺寸的问题
问题核心是macOS默认的窗口状态自动恢复机制在作祟——系统会自动保存并恢复窗口上次关闭时的大小、位置,导致你设置的初始尺寸被覆盖。以下是有效的解决方法:
方法一:禁用窗口自动恢复(推荐)
直接关闭系统的窗口恢复功能,让App每次启动都使用你指定的默认尺寸。在WindowGroup中添加windowRestorationPolicy(.manual),配合defaultSize即可:
@main struct YourAppName: App { var body: some Scene { WindowGroup { ContentView() } .defaultSize(width: 800, height: 600) .windowRestorationPolicy(.manual) // 禁用系统自动恢复窗口状态 } }
方法二:强制在视图加载后设置窗口尺寸
如果需要保留部分窗口恢复功能,可在ContentView的onAppear回调中强制设置窗口大小,覆盖系统恢复的状态:
struct ContentView: View { var body: some View { ScrollView { // 你的滚动内容 } .onAppear { // 获取第一个窗口并设置尺寸 if let mainWindow = NSApp.windows.first { mainWindow.setContentSize(NSSize(width: 800, height: 600)) } } } }
为什么你之前的方法无效?
- AppDelegate设置尺寸:调用时机太晚,系统的窗口恢复机制会在之后覆盖你设置的尺寸。
- WindowGroup.defaultSize:仅在窗口首次创建时生效,若系统恢复了之前的窗口状态,该默认值会被忽略。
- ContentView.frame:仅限制视图的最小尺寸,不会改变窗口本身的大小,窗口仍会遵循系统恢复的状态。
内容的提问来源于stack exchange,提问作者Peter Duckjibe
相关产品推荐
相关产品推荐

