Как удалить заполнение нижнего / верхнего элемента из списка SwiftUI в Mac OS

Мне трудно удалить все отступы из моих ячеек в 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, но я хочу сделать это в Mac OS (которая должна иметь такое же поведение, но это не так).


person csotiriou    schedule 01.08.2020    source источник


Ответы (1)


Вот демонстрация возможного решения (протестировано с 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 = $0.object as? NSTableView else { return }
            tableView.intercellSpacing = .zero
        }
    }
}
person Asperi    schedule 01.08.2020
comment
Есть ли способ удалить и разделители? - person csotiriou; 01.08.2020
comment
Я попробовал ваше решение. Я нашел 2 вещи: 1. listRowInsets абсолютно ничего не делает. 2. Нет разделителей! Я запустил приложение и щелкнул отладчик просмотра Xcode. Между ячейками нет разделителей, только отступы! - person csotiriou; 01.08.2020
comment
Это работает, но позвольте мне сделать 3 наблюдения: 1. Apple listRowsInsets ошибается и не работает в macOS? 2. Это единственный способ, но он неэффективен (уведомление будет вызываться при каждом обновлении кадра из каждого представления внутри приложения!). 3. Было бы лучше просто использовать NSTableView и просто обернуть его вокруг SwiftUI View, я прав? Я пытаюсь отобразить список из сотен тысяч элементов. - person csotiriou; 02.08.2020