在SwiftUI中,如何减少分组列表中各个部分之间的间距?

17
我一直在尝试减少应用GroupedListStyle()样式的列表中各个部分之间的间距,但没有成功。

分组列表图像

来自上面屏幕截图的代码:

struct ContentView: View {
    var body: some View {
        List {
            Section {
                Text("Hello, World!")
                Text("Hello, World!")
                Text("Hello, World!")
            }
            Section {
                Text("Hello, World!")
            }
            Section {
                Text("Hello, World!")
                Text("Hello, World!")

            }
        }.listStyle(GroupedListStyle())
    }
}

非常感谢您提出的任何建议。


这是默认布局。但是在Reduce Form spacing between sections SwiftUI中提供了可能的解决方案。 - Asperi
我有同样的问题。你找到任何解决方案了吗? - Yogendra Patel
5个回答

7

您可以像这样在视图之外添加它:

    struct ContentView: View {
        init() {
           UITableView.appearance().sectionFooterHeight = 0
        }

        var body: some View {}
    }

7
由于现在使用了UICollectionView,因此在iOS15+上无法正常工作。 - Deitsch

4
在iOS 17+中,List有一个叫做listSectionSpacing的修饰符,你可以使用它来指定间隔。
.listSectionSpacing(8)

1
那是iOS 17+。只是说说而已。 - undefined

4
iOS 13-15的列表是UITableView(在init中添加以下代码):
UITableView.appearance().sectionFooterHeight = 0

iOS 16-17 列表是 UICollectionView(在 init 中添加以下代码):
var layoutConfig = UICollectionLayoutListConfiguration(appearance: .grouped)
layoutConfig.headerMode = .supplementary
layoutConfig.headerTopPadding = 0
layoutConfig.footerMode = .supplementary
let listLayout = UICollectionViewCompositionalLayout.list(using: layoutConfig)
UICollectionView.appearance().collectionViewLayout = listLayout

iOS 17: 之前的解决方案仍然有效,但现在有一种新的方法:
.listSectionSpacing(0)

对UITableView.appearance()和UICollectionView.appearance()所做的更改也会影响应用中的所有其他列表。但是,您可以仅对当前列表应用更改,使用上述代码中的tableView和collectionView替换UITableView.appearance()和UICollectionView.appearance(),并使用swiftui-introspect
.introspectTableView { tableView in
    // code below
}

.introspectCollectionView { collectionView in
    // code below
}

2

我不喜欢这个解决方案,但我回想起UITableView的工作原理,并猜测可能是页脚间距导致了这个问题。

我添加了:

UITableView.appearance().sectionFooterHeight = 0

我将代码添加到视图的初始化中,似乎已经起作用。

我知道这会全局设置外观,因此当视图消失时重置该值可能是一个好主意。


你如何将这个添加到视图中? - user15072454
你可以将它放在视图的init中。虽然我后来发现使用LazyVStack比List更好。它不是由UITableView支持的,因此您不会遇到所有这些问题。 - Trevor

-4

您可以在您的部分中使用.listRowInsets(),并为底部使用负值。

.listRowInsets(EdgeInsets(top: 0,leading: 0,bottom: -20,trailing: 0))

这个不起作用。 - reisdev
在我的情况下,它有效。 - adri567
我试过了,不行。你的最低iOS SDK是多少? - reisdev
这会改变行间距,而不是段落间距。只在普通列表中起作用,因为它们有白色背景。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接