如何缩小SwiftUI中LazyHGrid组件的行间距?
问题原因
你设置的行间距不生效是三个问题叠加导致的:
Week视图内部的LazyHGrid加了全局padding(),给每个Week视图上下都增加了多余空白- 未给
GridItem指定固定高度,SwiftUI会自适应分配行高 - 外层Calendar的
LazyHGrid设置了远大于内容所需的height: 450,系统会自动把多余空白填充到行间距中,覆盖你设置的2px间距
修复方案
步骤1:修改Week视图
移除多余的上下padding,固定内容高度避免自适应撑开:
struct Week: View { var startDay: Int var endDay: Int // 固定行高和内容高度匹配 var rows: [GridItem] = [ GridItem(.fixed(30)) ] var body: some View { ScrollView(.horizontal) { LazyHGrid(rows: rows, alignment: .top, spacing: 50) { ForEach((startDay...endDay), id: \.self) { dayOfWeek in Text("\(dayOfWeek)") .font(.system(size: 20, weight: .semibold)) .frame(height: 30) } } // 只保留左右内边距,移除上下padding .padding(.horizontal) } // 固定Week视图高度和内容一致,避免多余空白 .frame(height: 30) } }
步骤2:修改Calendar视图
固定GridItem行高,设置匹配的总容器高度:
struct Calendar: View { // 统一设置4个GridItem,固定行高30,行间距2 var rows: [GridItem] = Array(repeating: GridItem(.fixed(30), spacing: 2), count: 4) var body: some View { ScrollView(.horizontal) { // 显式指定LazyHGrid的行间距为2,优先级高于GridItem设置 LazyHGrid(rows: rows, alignment: .top, spacing: 2) { ForEach((1...4), id: \.self) { _ in Week(startDay: 1, endDay: 7) } } // 总高度 = 4行*30 + 3个间距*2 = 126,不要设置远大于内容的高度 .frame(width: .infinity, height: 126) } } }
核心原理
- LazyHGrid的行间距优先级:
LazyHGrid初始化传入的spacing>GridItem初始化传入的spacing - 当容器总高度大于「所有行高度总和 + 行间距总和」时,SwiftUI会自动把多余空白平均分配到行间距中,导致自定义间距不生效
- 子视图的上下padding、自适应多余高度也会额外增加行之间的视觉间距
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

