Я должен признать, что я еще не провел большого исследования для Lazy Grids, но, увидев несколько примеров, я боюсь, что это будет невозможно. Но мое мышление программирования таково: все возможно . Итак, давайте сделаем собственное решение! Вот мой:
struct ContentView: View {
let items = (1 ... 12).map { "Item \($0)" }
var range: Range<Int> { 0 ..< Int((Double(items.count) / 3).rounded(.up)) }
var body: some View {
GeometryReader { geometry in
ScrollView {
LazyVStack { // still some laziness
ForEach(range, id: \.self) { index in
HStack(spacing: 0) {
if index % 2 == 0 {
Text(items[index * 3])
.frame(maxHeight: .infinity)
.frame(width: geometry.size.width * 2/3)
.background(Color(#colorLiteral(red: 0.3427395821, green: 0.7238617539, blue: 0.6179549098, alpha: 1)))
VStack(spacing: 0) {
Text(items[index * 3 + 1])
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(#colorLiteral(red: 0.1351453364, green: 0.1446713805, blue: 0.2671209574, alpha: 1)))
Text(items[index * 3 + 2])
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(#colorLiteral(red: 0.9248386621, green: 0.3957888484, blue: 0.3508865833, alpha: 1)))
}
.frame(maxHeight: .infinity)
.frame(width: geometry.size.width * 1/3)
} else {
VStack(spacing: 0) {
Text(items[index * 3])
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(#colorLiteral(red: 0.1351453364, green: 0.1446713805, blue: 0.2671209574, alpha: 1)))
Text(items[index * 3 + 1])
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(#colorLiteral(red: 0.9248386621, green: 0.3957888484, blue: 0.3508865833, alpha: 1)))
}
.frame(maxHeight: .infinity)
.frame(width: geometry.size.width * 1/3)
Text(items[index * 3 + 2])
.frame(maxHeight: .infinity)
.frame(width: geometry.size.width * 2/3)
.background(Color(#colorLiteral(red: 0.226172477, green: 0.3690122366, blue: 0.3273729682, alpha: 1)))
}
}
.frame(height: geometry.size.width * 6/16)
}
}
}
}
.foregroundColor(.white)
}
}
Объяснение: