I have implemented drag and drop for one view. Now I want to change the state of the source view at the start of a drag operation and change the state back at completion or cancellation. The following example code should illustrate this.
import UniformTypeIdentifiers
struct DragableView: View {
@State var isActiveDropTarget: Bool = false
@State var isDragged: Bool = false
var body: some View {
Text("Hello world")
.overlay(RoundedRectangle(cornerRadius: 8)
.fill(Color.accentColor.opacity(0.1))
.opacity(isActiveDropTarget ? 1.0 : 0.0))
.opacity(isDragged ? 0.5 : 1)
.onDrag {
isDragged = true
return NSItemProvider(object: "Test" as NSString)
}
.onDrop(of: [UTType.data], delegate: self)
}
}
extension DragableView: DropDelegate
{
func dropEntered(info: DropInfo)
{
isActiveDropTarget = true
}
func dropExited(info: DropInfo)
{
isActiveDropTarget = false
}
func performDrop(info: DropInfo) -> Bool
{
isActiveDropTarget = false
/* Handle drop
...
*/
return true
}
}
The problem with the current implementation is that I do notice when a drag operation starts (.onDrag is called), but I don't know when the operation ends.