Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import SwiftUI
- import UniformTypeIdentifiers
- struct ContentView: View {
- @State var items = ["1", "2", "3"]
- @State var draggedItem : String?
- @State var isHovering: Bool = false
- var body: some View {
- VStack {
- ForEach(items, id:\.self) { item in
- HStack {
- Image(systemName: "line.horizontal.3")
- Text(item)
- }
- .frame(minWidth: 0, maxWidth: .infinity, minHeight: 50)
- .border(Color.black).background(Color.teal)
- .onDrag({
- self.draggedItem = item
- return NSItemProvider(item: nil, typeIdentifier: item)
- })
- .onDrop(of: [UTType.text], delegate: MyDropDelegate(item: item, items: $items, draggedItem: $draggedItem))
- }
- .onMove { indices, newOffset in
- self.items.move(
- fromOffsets: indices,
- toOffset: newOffset
- )
- }
- }
- }
- }
- struct MyDropDelegate : DropDelegate {
- let item : String
- @Binding var items : [String]
- @Binding var draggedItem : String?
- func validateDrop(info: DropInfo) -> Bool {
- return true
- }
- func dropUpdated(info: DropInfo) -> DropProposal? {
- return DropProposal(operation: .move)
- }
- 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)
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement