#swiftui #lazyvgrid
#swiftui #lazyvgrid
Вопрос:
В a LazyVGrid
я показываю данные, поступающие с сервера (здесь я использую алфавит в качестве примера), и моя цель — показать последнюю строку в центре, а leading
не если последняя строка содержит менее 3 элементов. Выполнимо ли это?
В настоящее время это выглядит так:
struct ContentView: View {
let alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
let preference = [
GridItem(.flexible()),
GridItem(.flexible()),
GridItem(.flexible())
]
var body: some View {
ScrollView {
LazyVGrid(columns: preference) {
ForEach(alphabet, id: .self) { value in
ZStack {
Rectangle()
.frame(width: 120, height: 120)
.foregroundColor(Color(UIColor.systemIndigo))
.cornerRadius(16)
Text(value.description)
.foregroundColor(.white)
.font(.title)
}
}
}
}
}
}
Цель:
Комментарии:
1. должно ли быть только 3 столбца, даже если устройство имеет альбомную ориентацию?
2. @Yodagama Спасибо, что спросили! Пока давайте просто подумаем, что приложение поддерживает только портретный режим.
Ответ №1:
Загружайте каждую ячейку лениво.
struct ContentView: View {
let alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
let preference = [
GridItem(.flexible()),
GridItem(.flexible()),
GridItem(.flexible())
]
var body: some View {
ScrollView {
LazyVGrid(columns: preference) {
ForEach(alphabet.dropLast(alphabet.count % 3), id: .self) { value in
Cell(value: value)
}
}
LazyHStack {
ForEach(alphabet.suffix(alphabet.count % 3), id: .self) { value in
Cell(value: value)
}
}
}
}
}
извлек ваш вид ячейки для повторного использования
struct Cell: View {
let value: String
var body: some View {
print(value)
return ZStack {
Rectangle()
.frame(width: 120, height: 120)
.foregroundColor(Color(UIColor.systemIndigo))
.cornerRadius(16)
Text(value)
.foregroundColor(.white)
.font(.title)
}
}
}
Комментарии:
1. Это здорово! Спасибо!!