Как удалить нижний / верхний отступ элементов из списка SwiftUI в Ma c OS - PullRequest
1 голос
/ 01 августа 2020

Мне трудно удалить все отступы из моих ячеек в MacOS с помощью SwiftUI. Кажется, я не могу сделать это даже в Apple Code!

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

Например, внутри LandMarkList из MacLandmarks в Xcode, я поставил .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())
        }
    }
}

Я также добавил красный цвет фона в каждую ячейку. Вот результат, который я получаю:

Пространства сверху и снизу

Дело в том, что я просто не могу избавиться от вертикального пространства между ячейками этого списка. Все решения, которые я видел, похоже, упоминают iOS для этого, но я хочу сделать это в ОС Ma c (которая должна иметь такое же поведение, но это не так).

1 Ответ

1 голос
/ 01 августа 2020

Вот демонстрация возможного решения (протестировано с Xcode 11.4 / macOS 10.15.6).

Примечание: если потребуется несколько активных списков (ie. 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 = $0.object as? NSTableView else { return }
            tableView.intercellSpacing = .zero
        }
    }
}
...