Skip to content

Instantly share code, notes, and snippets.

@AviTsadok
Created July 10, 2021 12:14
Show Gist options
  • Save AviTsadok/de5d89abfcda1a8fa48e818b687032b8 to your computer and use it in GitHub Desktop.
Save AviTsadok/de5d89abfcda1a8fa48e818b687032b8 to your computer and use it in GitHub Desktop.
SwiftUI LazyVStack reordering
import SwiftUI
import UniformTypeIdentifiers
@available(iOS 13.0.0, *)
struct ContentView: View {
@State var items = ["1", "2", "3"]
@State var draggedItem : String?
var body: some View {
LazyVStack(spacing : 15) {
ForEach(items, id:\.self) { item in
Text(item)
.frame(minWidth:0, maxWidth:.infinity, minHeight:50)
.border(Color.black).background(Color.red)
.onDrag({
self.draggedItem = item
return NSItemProvider(item: nil, typeIdentifier: item)
}) .onDrop(of: [UTType.text], delegate: MyDropDelegate(item: item, items: $items, draggedItem: $draggedItem))
}
}
}
}
struct MyDropDelegate : DropDelegate {
let item : String
@Binding var items : [String]
@Binding var draggedItem : String?
func performDrop(info: DropInfo) -> Bool {
return true
}
func dropEntered(info: DropInfo) {
guard let draggedItem = self.draggedItem else {
return
}
if draggedItem != item {
let from = items.firstIndex(of: draggedItem)!
let to = items.firstIndex(of: item)!
withAnimation(.default) {
self.items.move(fromOffsets: IndexSet(integer: from), toOffset: to > from ? to + 1 : to)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment