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

SwiftUI中如何调整Sheet视图的尺寸?

SwiftUI Sheet 尺寸调整解决方案

问题核心

你当前使用NavigationView + Form的组合会默认撑满Sheet的可用空间,导致即使设置presentationDetents或frame也无法有效缩小尺寸。以下是两种可行的解决方法:


方法一:替换为轻量布局(推荐)

抛弃Form和冗余的NavigationView,改用VStack构建紧凑布局,让视图仅包裹内容:

import SwiftUI

struct AddNewFolderView: View {
    @Environment(\.managedObjectContext) private var viewContext
    @Environment(\.presentationMode) var presentationMode
    @State private var folderName = ""
    
    private func addFolder() {
        // 你的添加文件夹逻辑
        presentationMode.wrappedValue.dismiss()
    }
    
    var body: some View {
        VStack(spacing: 20) {
            // 标题
            Text("New Folder")
                .font(.headline)
            
            // 输入框
            TextField("Enter folder name", text: $folderName)
                .textFieldStyle(.roundedBorder)
                .padding(.horizontal)
            
            // 操作按钮
            HStack {
                Spacer()
                Button("Cancel") {
                    presentationMode.wrappedValue.dismiss()
                }
                
                Button("Save") {
                    addFolder()
                }
                .foregroundColor(.blue)
            }
            .padding(.horizontal)
        }
        .padding()
        .presentationDetents([.height(220)]) // 自定义Sheet高度
    }
}

方法二:保留Form和NavigationView的适配

如果必须保留原有组件结构,需要给NavigationView设置固定高度,并配合presentationDetents:

  1. 修改ContentView的Sheet配置:
.sheet(isPresented: $showingAddFolderView) {
    AddNewFolderView()
        .environment(\.managedObjectContext, self.viewContext)
        .presentationDetents([.height(250)]) // 指定Sheet高度
}
  1. 修改AddNewFolderView的NavigationView:
var body: some View {
    NavigationView {
        Form {
            Section(header: Text("Folder Name")) {
                TextField("Enter folder name", text: $folderName)
            }
        }
        .navigationBarTitle("New Folder", displayMode: .inline)
        .navigationBarItems(
            leading: Button("Cancel") {
                presentationMode.wrappedValue.dismiss()
            },
            trailing: Button("Save") {
                addFolder()
            }
        )
    }
    .frame(height: 250) // 强制限制NavigationView高度
}

注意事项

  • presentationDetents仅支持iOS 15.0+,如果需要兼容更低版本,需通过UIKit的UISheetPresentationController进行自定义配置。
  • 轻量布局方案不仅能解决尺寸问题,还能提升视图加载效率,更适合这种简单的输入场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:32:53