如何从 Mac OS 中的 SwiftUI 列表中删除 bottom/top 项目填充

How to remove bottom/top item padding from SwiftUI List in Mac OS

我很难使用 SwiftUI 从 MacOS 中的单元格中删除所有填充。我好像连苹果的代码都做不到!

https://developer.apple.com/tutorials/swiftui/creating-a-macos-app

例如,在Xcode中的MacLandmarks文件夹的LandMarkList里面,我在forEach的末尾放了一个.listRowInsets(EdgeInsets())所以代码如下所示:

struct LandmarkList: View {
    @EnvironmentObject private var userData: UserData
    @Binding var selectedLandmark: Landmark?
    @Binding var filter: FilterType

    var body: some View {
        List(selection: $selectedLandmark) {
            ForEach(userData.landmarks) { landmark in
                if (!self.userData.showFavoritesOnly || landmark.isFavorite)
                    && (self.filter == .all
                        || self.filter.category == landmark.category
                        || (self.filter.category == .featured && landmark.isFeatured)) {
                    LandmarkRow(landmark: landmark).tag(landmark)
                        .background(Color.red)
                }
            }
            .listRowInsets(EdgeInsets())
        }
    }
}

我还在每个单元格中设置了红色背景色。这是我得到的结果:

关键是我似乎无法摆脱此列表单元格之间的垂直 space。我见过的所有解决方案似乎都为此提到了 iOS,但我想在 Mac OS 中执行此操作(应该具有相同的行为,但事实并非如此)。

这是一个可能的解决方案演示(使用 Xcode 11.4 / macOS 10.15.6 测试)。

注意:如果需要有多个活动列表(即 NSTableView)并且其中一些应该有单元间距(也称为分隔符),那么它们应该由 SwiftUI 工具来完成,因为这方法禁用所有可见列表的单元间距

var body: some View {
    VStack {
        Text("Selected: \(selectedPerson ?? "<none>")")
        List(selection: $selectedPerson) {
             ForEach(persons, id: \.self) { person in
                Text(person)
             }
             .listRowBackground(Color.red)
             .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
        }.border(Color.green)
        .onReceive(NotificationCenter.default.publisher(for: NSView.frameDidChangeNotification)) {
            guard let tableView = [=10=].object as? NSTableView else { return }
            tableView.intercellSpacing = .zero
        }
    }
}