I have the following SwiftUI view:
struct ContentView: View {
@State var model: Model
var body: some View {
ScrollView {
LazyVGrid(columns: columns, spacing: 10) {
ForEach(model.events, id: \.self) { event in
CardView(event: event)
}
.onMove { indices, newOffset in
model.events.move(fromOffsets: indices, toOffset: newOffset)
}
}
}
}
}
However, it doesn't appear that the onMove
closure is executing. I believe this is because all gestures are only given to the ScrollView
and so the inner views don't receive the gestures.
I tried converting this view to a List
, however I don't want the row separators, which in iOS 14 I believe are impossible to hide.
So, I was wondering what I need to change to get this to allow the user to drag and drop CardView
s to reorder them. Thanks!
According to Apple reply in Drag and Drop to reorder Items using the new LazyGrids?
That's not built-today, though you can use the View.onDrag(_:) and View.onDrop(...) to add support for drag and drop manually.
Do file a feedback request if you'd like to see built-in reordering support. Thanks!
So the solution using .onDrag & .onDrop provided in my answer for actually duplicated question in https://stackoverflow.com/a/63438481/12299030
Main idea is to track drug & drop by grid card views and reorder model in drop delegate, so LazyVGrid animates subviews:
LazyVGrid(columns: model.columns, spacing: 32) {
ForEach(model.data) { d in
GridItemView(d: d)
.overlay(dragging?.id == d.id ? Color.white.opacity(0.8) : Color.clear)
.onDrag {
self.dragging = d
return NSItemProvider(object: String(d.id) as NSString)
}
.onDrop(of: [UTType.text], delegate: DragRelocateDelegate(item: d, listData: $model.data, current: $dragging))
}
}.animation(.default, value: model.data)
...
func dropEntered(info: DropInfo) {
if item != current {
let from = listData.firstIndex(of: current!)!
let to = listData.firstIndex(of: item)!
if listData[to].id != current!.id {
listData.move(fromOffsets: IndexSet(integer: from),
toOffset: to > from ? to + 1 : to)
}
}
}
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