I'm trying to implement a view that contains a LazyVGrid of staggered images in a grid- as seen in the below Pinterest feed:
I am aware of the WaterfallGird library but I was wondering if there would be a way to implement this functionality with a LazyGrid, instead of an ordinary V/HGrid.
A container view that arranges its child views in a grid that grows vertically, creating items only as needed.
A rough example as follows...
// split array
let splitArrays = ([TileItem], [TileItem])
ScrollView {
LazyVGrid(*setup GridItems here*) {
VStack {
ForEach(splitArrays.0) { tile in
Image(tile.image)
}
}
VStack {
ForEach(splitArrays.0) { tile in
Image(tile.image)
}
}
}
}
It's likely that this isn't very performant, but it should be able to do what you're after.
Beau Nouvelle solution is working, however, it's buggy and glitchy at least of me. Instead of using LazyVGrid
if we use HStack
with alignment: .top
It works better.
Here is the view
var body: some View {
HStack(alignment: .top) {
LazyVStack(spacing: 8) {
ForEach(splitArray[0]) {...}
}
LazyVStack(spacing: 8) {
ForEach(splitArray[1]) {...}
}
}
}
Here is the code to split the array
private var splitArray: [[Photo]] {
var result: [[Photo]] = []
var list1: [Photo] = []
var list2: [Photo] = []
photos.forEach { photo in
let index = photos.firstIndex {$0.id == photo.id }
if let index = index {
if index % 2 == 0 {
list1.append(photo)
} else {
list2.append(photo)
}
}
}
result.append(list1)
result.append(list2)
return result
}
I know this is not performance but so far only working solution I found.
Here is the full source code
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With