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

macOS SwiftUI:无需硬编码尺寸,正确在Sheet中显示Button与List

macOS SwiftUI Sheet 中 List 无法自动扩展尺寸的解决方案

在macOS的SwiftUI环境下,Sheet默认不会根据List内容自动调整尺寸,核心原因是布局系统对并列视图的尺寸计算逻辑与iOS不同:当Sheet根视图直接放置多个元素时,会优先以最紧凑的元素(比如你的“Done”按钮)确定整体尺寸,而List不会主动抢占可用空间。

解决方案1:用容器视图包裹并让List填充空间

给Sheet的根视图套上VStack容器,同时给List添加.frame(maxWidth: .infinity, maxHeight: .infinity)修饰符,让List填充容器剩余空间,Sheet就会根据List内容自动适配合理尺寸:

import SwiftUI

struct ContentView: View {
    @State var isPresented = false
    var stuffs = ["stuff 0", "stuff 1", "stuff 3"]

    var body: some View {
        VStack {
            Button("Show Sheet") {
                isPresented = true
            }
        }
        .padding()
        .sheet(isPresented: $isPresented) {
            VStack {
                Button("Done") {
                    isPresented = false
                }
                .padding()

                List {
                    ForEach(stuffs, id: \.self) { stuff in
                        Text(stuff)
                    }
                }
                .frame(maxWidth: .infinity, maxHeight: .infinity)
            }
        }
    }
}

解决方案2:用导航栏放置“Done”按钮(更贴合macOS规范)

对于macOS应用,将操作按钮放在导航栏是更符合平台设计的做法,同时Sheet会自动适配List的内容尺寸:

import SwiftUI

struct ContentView: View {
    @State var isPresented = false
    var stuffs = ["stuff 0", "stuff 1", "stuff 3"]

    var body: some View {
        VStack {
            Button("Show Sheet") {
                isPresented = true
            }
        }
        .padding()
        .sheet(isPresented: $isPresented) {
            NavigationStack {
                List {
                    ForEach(stuffs, id: \.self) { stuff in
                        Text(stuff)
                    }
                }
                .navigationTitle("Stuffs")
                .toolbar {
                    ToolbarItem(placement: .confirmationAction) {
                        Button("Done") {
                            isPresented = false
                        }
                    }
                }
            }
        }
    }
}

两种方案都无需硬编码尺寸,能自动适配窗口与内容大小,其中第二种更贴合macOS的交互设计习惯。

内容的提问来源于stack exchange,提问作者aarku

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 01:57:43