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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:12:09