Created
July 10, 2021 12:14
-
-
Save AviTsadok/de5d89abfcda1a8fa48e818b687032b8 to your computer and use it in GitHub Desktop.
SwiftUI LazyVStack reordering
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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