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:
- 修改ContentView的Sheet配置:
.sheet(isPresented: $showingAddFolderView) { AddNewFolderView() .environment(\.managedObjectContext, self.viewContext) .presentationDetents([.height(250)]) // 指定Sheet高度 }
- 修改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
相关产品推荐
相关产品推荐

