SwiftUI:如何阻止底部Sheet因键盘弹出上移至全屏
解决SwiftUI Sheet弹出键盘时内容被推高的问题
要禁用键盘推高Sheet内容的行为,有两种简单有效的方法:
方法一:忽略键盘安全区域
直接给Sheet的内容视图添加ignoresSafeArea(.keyboard)修饰符,让视图不响应键盘弹出的安全区域变化,从而保持Sheet的原有位置。
修改后的AddingItemView代码:
struct AddingItemView: View { @State var price: String = "" var done: (String) -> Void // 补充原代码中缺失的回调参数 var body: some View { VStack { HStack { Text("test") TextField("Please input price", text: $price) .keyboardType(.numberPad) .textFieldStyle(RoundedBorderTextFieldStyle()) }.padding() Spacer() } .background(Color.white) .ignoresSafeArea(.keyboard) // 关键:忽略键盘安全区域 } }
方法二:修改Sheet控制器属性
如果方法一效果不佳,可以通过SwiftUI的onAppear回调获取底层的UISheetPresentationController,调整其滚动扩展相关的属性,阻止键盘推高Sheet:
修改后的ContentView中Sheet部分的代码:
.sheet(isPresented: $isShowingAddingItem) { AddingItemView(done: { item in theItems.append(item) }) .presentationDetents([.medium, .large]) .onAppear { guard let window = UIApplication.shared.windows.first, let sheet = window.rootViewController?.presentedViewController as? UISheetPresentationController else { return } sheet.animateChanges { sheet.prefersScrollingExpandsWhenScrolledToEdge = false sheet.prefersEdgeAttachedInCompactHeight = true sheet.widthFollowsPreferredContentSizeWhenEdgeAttached = true } } }
注意事项
- 方法一优先推荐,代码更简洁且适配性更好。
- 如果Sheet内包含ScrollView,可额外结合
scrollDismissesKeyboard(.interactively)优化键盘交互体验。
内容的提问来源于stack exchange,提问作者William Hu
相关产品推荐
相关产品推荐

