Это не пустые ячейки. List
просто заполняет все доступное пространство, а dr aws пустые строки заполнители там, где нет содержимого. В вашем сценарии необходимо ограничить высоту List
его содержимым.
Вот решение. Протестировано с Xcode 11.4 / iOS 13.4
Для лучшей наглядности давайте разделим ваш список в собственное представление с именем CovidDataList
, тогда вот в вашем предоставленном body
:
//List to Initialize TableView Data
CovidDataList(covid: self.covid)
}//END List
Примечание 1: высота списка обновляется во время выполнения, поэтому его следует проверять в работающем приложении (не в предварительной версии)
Примечание 2: я тестировал с реплицированной моделью данных обложки, поэтому некоторая адаптация может необходимо для вашего кода
struct CovidDataList: View {
@Environment(\.defaultMinListRowHeight) var minRowHeight
let covid: [CovidData]
@State private var listHeight = CGFloat.infinity
var body: some View {
List {
ForEach(covid, id: \.self) { covidData in
HStack {
Image(systemName: "photo")
.padding()
HStack {
Text("Title").frame(maxWidth: .infinity, alignment: .leading)
Text("Value")
.font(.subheadline)
.frame(maxWidth: .infinity, alignment: .trailing)
}
}
.listRowInsets(EdgeInsets()).padding(.horizontal)
}
.anchorPreference(key: BoundsPreferenceKey.self, value: .bounds) { [$0] }
}
.backgroundPreferenceValue(BoundsPreferenceKey.self) { rects in
GeometryReader { gp in
self.updateListFrame(gp: gp, anchors: rects)
}
}.frame(maxHeight: listHeight)
}
private func updateListFrame(gp: GeometryProxy, anchors: [Anchor<CGRect>]) -> some View {
let contentHeight = anchors.reduce(CGFloat.zero) { $0 + gp[$1].size.height }
DispatchQueue.main.async { // << required !!
self.listHeight = max(contentHeight, self.minRowHeight * CGFloat(self.covid.count))
}
return Color.clear
}
}
Примечание: BoundsPreferenceKey
взято из это мой ответ