如何在Mac OS中从SwiftUI列表中删除底部/顶部的项目填充

时间:2020-08-01 11:21:16

标签: ios macos swiftui swiftui-list

我很难使用SwiftUI从MacOS的单元格中删除所有填充。即使使用Apple的Code,我似乎也无法做到!

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

例如,在Xcode的LandMarkList文件夹的MacLandmarks内,我在.listRowInsets(EdgeInsets())的末尾放置了一个forEach,使代码看起来像这样:

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())
        }
    }
}

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

Spaces top and bottom

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

1 个答案:

答案 0 :(得分:1)

这里是可能解决方案的演示(已通过Xcode 11.4 / macOS 10.15.6测试)。

注意:如果需要具有多个活动列表(即NSTableView),并且其中一些应该具有单元格间距(aka分隔符),则应由SwiftUI仪器完成,因为此方法会禁用单元格间距对于所有可见列表

demo

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 = $0.object as? NSTableView else { return }
            tableView.intercellSpacing = .zero
        }
    }
}