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

如何缩小SwiftUI中LazyHGrid组件的行间距?

问题原因

你设置的行间距不生效是三个问题叠加导致的:

  1. Week 视图内部的 LazyHGrid 加了全局 padding(),给每个Week视图上下都增加了多余空白
  2. 未给GridItem指定固定高度,SwiftUI会自适应分配行高
  3. 外层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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:24:01