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

iOS15 Xcode13 beta5下SwiftUI自定义键盘View无法撑满高度如何解决

解决方法

核心原因是SwiftUI默认布局规则下,受限高度的容器会优先满足子视图的固有内容尺寸,同时系统Button的默认样式自带内边距和尺寸限制,导致你设置的maxHeight: .infinity优先级被覆盖。按以下步骤修改即可:

  1. 给键盘整体的外层VStack显式设置固定行间距,替换系统默认的动态间距,避免高度不足时自动压缩行高
  2. 给每一行的HStack添加maxHeight: .infinity修饰符,强制每行均分键盘整体可用高度
  3. 给所有按键添加PlainButtonStyle,移除系统默认的Button内边距和最小尺寸限制
  4. 给回退键的图片添加fixedSize()修饰符,保证20*20的尺寸固定,同时不干扰父容器的尺寸计算

修改后的关键代码片段

1. 回退按键部分
case .backspace:
    Image(systemName: "delete.left")
        .resizable()
        .frame(width: 20, height: 20)
        .fixedSize() // 新增:固定图片尺寸,避免被压缩/拉伸
        .background(Color.green)
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .background(Color.red)
        .cornerRadius(6)

你之前包裹Image的无意义HStack可以直接删掉,不影响布局。

2. 键盘整体布局部分
var body: some View {
    VStack(spacing: 5) { // 新增:显式设置行间距
        ForEach(0..<rows.count, id: \.self) { rowIndex in
            let row = rows[rowIndex]
            HStack(spacing: 5) {
                ForEach(row, id: \.self) { key in
                    Button(action: {
                        print("Tapped: \(key)")
                    }) {
                        key.view()
                    }
                    .buttonStyle(PlainButtonStyle()) // 新增:移除系统Button默认样式限制
                }
            }
            .frame(maxHeight: .infinity) // 新增:每行均分高度
        }
    }
    .padding(5)
    .padding(.bottom, 40)
    .background(Color.keyboardBackground)
}

修改后无论是iOS14还是iOS15,设置200高度限制、横屏场景下所有按键都会均等分配高度,回退键会撑满可用空间,内部图片保持20*20的固定尺寸。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:39:02