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

SwiftUI键盘弹出致所有视图上移问题及解决方案咨询

问题:键盘弹出时所有视图被向上推送

示例代码:

var body: some Scene {
  WindowGroup {
    
    let full = UIScreen.main.bounds.size.height
    
    ZStack(alignment: .top) {
      
      // View 1
      
      Color.blue
        .frame(height: full / 4)
        .ignoresSafeArea(.all)
        .zIndex(1)
      
      ZStack {
        
        // View 2
        
        Color.green
          .frame(height: full / 2)
          .padding(.bottom, full / 2)
        
        // View 3
        
        ZStack {
          Color.red
          TextField("Placeholder", text: .constant(""))
        }
        .frame(height: full / 2)
        .padding(.top, full / 2)
      }
      .frame(height: full)
      .ignoresSafeArea(.all)
    }
    .frame(height: full)
    .ignoresSafeArea(.all)
  }
}

需求:让View 1(蓝色视图)、View 2(绿色视图)不随键盘上移,或让所有视图保持原有位置。


解决方法

1. 全局阻止键盘推视图

给根容器添加.ignoresSafeArea(.keyboard)修饰符,彻底禁用SwiftUI因键盘弹出调整布局的行为,所有视图会保持原位:

修改最外层ZStack的修饰符:

ZStack(alignment: .top) {
  // ... 原有视图内容
}
.frame(height: full)
.ignoresSafeArea(.all)
.ignoresSafeArea(.keyboard) // 新增这一行

2. 仅固定指定视图

如果只想让View 1和View 2保持不动,可将它们单独放在一个容器中并添加.ignoresSafeArea(.keyboard),View 3所在容器可正常响应键盘(若需要View 3也不动,同样添加该修饰符):

WindowGroup {
  let full = UIScreen.main.bounds.size.height
  
  ZStack(alignment: .top) {
    // View1 和 View2 容器,固定位置
    ZStack {
      Color.blue
        .frame(height: full / 4)
        .ignoresSafeArea(.all)
        .zIndex(1)
      
      Color.green
        .frame(height: full / 2)
        .padding(.bottom, full / 2)
    }
    .ignoresSafeArea(.keyboard) // 忽略键盘安全区域变化
    
    // View3 容器
    ZStack {
      Color.red
      TextField("Placeholder", text: .constant(""))
    }
    .frame(height: full / 2)
    .padding(.top, full / 2)
  }
  .frame(height: full)
  .ignoresSafeArea(.all)
}

3. 优化布局方式(可选)

建议用GeometryReader替代UIScreen.main.bounds获取高度,更适配SwiftUI的布局逻辑,避免设备旋转、安全区域变化带来的异常:

WindowGroup {
  GeometryReader { proxy in
    let full = proxy.size.height
    
    ZStack(alignment: .top) {
      // ... 原有视图内容
    }
    .frame(height: full)
    .ignoresSafeArea(.all)
    .ignoresSafeArea(.keyboard)
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:20:33