SwiftUI:如何消除NavigationView中List顶部的多余间距?
解决iOS 15中SwiftUI List带Section的顶部间距过大问题
以下是几种无副作用的优化方案,替代你之前的取巧实现:
方案一:使用官方原生修饰符(推荐)
iOS 15及以上版本提供了listSectionHeaderPadding修饰符,可以直接控制Section标题的内边距,完全不会影响滚动视图的正常行为:
struct NewView: View { var body: some View { NavigationView { List { Section("Title") { ForEach((1...10), id: \.self) { Text("\($0)") } } .listSectionHeaderPadding(.zero) // 消除默认顶部间距 // 如需精细调整,可传入自定义内边距 // .listSectionHeaderPadding(EdgeInsets(top: -8, leading: 0, bottom: 0, trailing: 0)) } .navigationTitle("Title") } } }
方案二:自定义Section Header视图
如果需要完全控制标题的样式和间距,可以直接自定义Section的Header视图,彻底摆脱系统默认的间距限制:
struct NewView: View { var body: some View { NavigationView { List { Section { ForEach((1...10), id: \.self) { Text("\($0)") } } header: { Text("Title") .font(.headline) // 匹配系统默认标题字体 .padding(.top, -10) // 自定义顶部间距 .padding(.bottom, 4) // 保持标题与内容的合理间距 } } .navigationTitle("Title") } } }
方案三:切换List样式
不同的listStyle自带不同的间距设计,如果你界面风格允许,切换样式可以自然减小顶部间距:
struct NewView: View { var body: some View { NavigationView { List { Section("Title") { ForEach((1...10), id: \.self) { Text("\($0)") } } } .listStyle(.insetGrouped) // 切换为内边距分组样式 .navigationTitle("Title") } } }
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

