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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 14:38:14