macOS 15下SwiftUI Sheet无法调整大小问题求助
macOS SwiftUI Sheet 无法调整大小的解决方法
在macOS SwiftUI应用中,主窗口通过设置frame的最小/最大宽高可以实现拖拽调整尺寸,但Sheet使用同样方式却无法显示调整箭头,无法调整大小。
问题代码示例
主窗口可调整大小的代码:
Window("SingleWindow", id: "single") { RootMacView() .frame(minWidth: 1000, maxWidth: .infinity, minHeight: 800, maxHeight: .infinity) }
Sheet无法调整大小的代码:
.sheet(isPresented: $showCellarsEditor) { VStack { Text("Test") } .frame(minWidth: 1000, maxWidth: .infinity, minHeight: 800, maxHeight: .infinity) }
原因及解决方法
macOS的Sheet默认是不可调整大小的窗口样式,需要手动开启可调整属性,分两种情况处理:
1. macOS 13(Ventura)及以上版本
使用SwiftUI原生的.presentationWindowStyle(.resizable)修饰符,同时可添加拖拽指示器优化交互:
.sheet(isPresented: $showCellarsEditor) { VStack { Text("Test") } .frame(minWidth: 1000, maxWidth: .infinity, minHeight: 800, maxHeight: .infinity) .presentationDragIndicator(.visible) // 显示顶部拖拽条 .presentationWindowStyle(.resizable) // 开启窗口可调整样式 }
2. macOS 12(Monterey)及以下版本
需要通过AppKit的NSWindowAPI修改窗口样式,在Sheet的onAppear回调中添加逻辑:
.sheet(isPresented: $showCellarsEditor) { VStack { Text("Test") } .frame(minWidth: 1000, maxWidth: .infinity, minHeight: 800, maxHeight: .infinity) .onAppear { guard let sheetWindow = NSApplication.shared.windows.last else { return } // 添加可调整、可最小化、可关闭的窗口样式 sheetWindow.styleMask.insert(.resizable) sheetWindow.styleMask.insert(.miniaturizable) sheetWindow.styleMask.insert(.closable) // 设置初始尺寸 sheetWindow.setContentSize(NSSize(width: 1000, height: 800)) } }
添加上述配置后,Sheet就会显示边框调整箭头,支持拖拽调整大小。
内容的提问来源于stack exchange,提问作者alex.bour
相关产品推荐
相关产品推荐

