iOS15 Xcode13 beta5下SwiftUI自定义键盘View无法撑满高度如何解决
解决方法
核心原因是SwiftUI默认布局规则下,受限高度的容器会优先满足子视图的固有内容尺寸,同时系统Button的默认样式自带内边距和尺寸限制,导致你设置的maxHeight: .infinity优先级被覆盖。按以下步骤修改即可:
- 给键盘整体的外层
VStack显式设置固定行间距,替换系统默认的动态间距,避免高度不足时自动压缩行高 - 给每一行的
HStack添加maxHeight: .infinity修饰符,强制每行均分键盘整体可用高度 - 给所有按键添加
PlainButtonStyle,移除系统默认的Button内边距和最小尺寸限制 - 给回退键的图片添加
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
相关产品推荐
相关产品推荐

