SwiftUI中点击TextField无法触发底部视图上移如何解决?
问题根因
- 你把
keyboardAdaptive修饰符加在了CardContent上,但承载内容的BottomCard内部卡片容器固定了300高度,内容增加底部padding只会挤压内部控件,无法推动整个底部卡片上移 BottomCard的卡片容器仅通过固定offset控制显隐,没有和键盘高度做联动,键盘弹出时自然不会调整偏移量- 你写的动画修饰符
animation绑定的value是固定常量,状态变化时不会触发对应动画,属于隐藏逻辑错误
修复方案
直接调整BottomCard的偏移逻辑,监听键盘高度动态调整卡片位置即可,不需要依赖作用于内容的keyboardAdaptive修饰符:
- 删除
CardContent上的.keyboardAdaptive()修饰符 - 替换
BottomCard的代码为以下修改后的版本:
struct BottomCard<Content: View>: View { let content: Content @Binding var cardShown: Bool @Binding var cardDismissal: Bool let height: CGFloat // 新增键盘高度监听状态 @State private var keyboardHeight: CGFloat = 0 init(cardShown: Binding<Bool>, cardDismissal: Binding<Bool>, height: CGFloat, @ViewBuilder content: () -> Content) { _cardShown = cardShown _cardDismissal = cardDismissal self.height = height self.content = content() } var body: some View { ZStack { // 半透明遮罩 GeometryReader { _ in EmptyView() } .background(Color.gray.opacity(0.5)) .opacity(cardShown ? 1: 0) // 修复动画绑定值为动态状态cardShown .animation(.easeIn, value: cardShown) .onTapGesture { dismiss() } // 底部卡片容器 VStack { Spacer() VStack { content Button(action: { dismiss() }, label: { Text("Dismiss") .foregroundColor(Color.white) .frame(width: UIScreen.main.bounds.width/2, height: 50) .background(Color.pink) .cornerRadius(8) }) .padding() } .background(Color(UIColor.secondarySystemBackground)) .frame(height: height) // 偏移量关联键盘高度 .offset(y: cardShown ? -keyboardHeight : 500) // 修复动画绑定值为动态状态cardShown .animation(.default.delay(0.2), value: cardShown) } } // 监听键盘高度变化 .onReceive(Publishers.keyboardHeight) { height in // 减去底部安全区高度,避免卡片和键盘之间出现多余空隙 let safeBottom = UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0 keyboardHeight = max(0, height - safeBottom) } .edgesIgnoringSafeArea(.all) } func dismiss() { // 关闭前先收起键盘,避免动画异常 UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) cardDismissal.toggle() DispatchQueue.main.asyncAfter(deadline: .now()+0.25) { cardShown.toggle() } } }
修改完成后点击输入框,整个底部卡片就会自动跟随键盘上移,键盘收起时也会自动回落。
内容的提问来源于stack exchange,提问作者user1960279
相关产品推荐
相关产品推荐

