SwiftUI:`onDrop` 覆盖不会在 LazyVGrid 中消失?
SwiftUI: `onDrop` overlay not going away in LazyVGrid?
我正在测试 Asperi 对单元格重新排序的出色回答:
我遇到的问题是,当我只是进入拖动模式然后放置到位时,叠加层不会重置,请参见单元格 3:
我使用的是在答案中找到的确切代码。所以看起来像这样一行:
.overlay(dragging?.id == d.id ? Color.white.opacity(0.8) : Color.clear)
反应不正常?
知道如何让叠加层更新并返回 clear
吗?
实际上这是一个 SwiftUI 错误,因为在这种情况下 onDrag
被调用,但 onDrop
不是(从 D&D 流程的角度来看这是错误的)。
一个可能的解决方法是引入额外的 in-progress 状态来表明 D&D 真正开始了。 (其实我会想一些重构来简化delegate的接口,但是对于demo是可以的)
测试 Xcode 13.3 / iOS 15.4
更改如下:
@State private var isUpdating = false // in-progress state
// ...
.overlay(dragging?.id == d.id && isUpdating ? // << additional condition
Color.white.opacity(0.8) : Color.clear)
// ...
.onDrop(of: [UTType.text], delegate: DragRelocateDelegate(item: d, listData: $model.data,
current: $dragging, updating: $isUpdating)) // << transfer into delegate
// ...
func dropEntered(info: DropInfo) {
updating = true // << indicate that D&D begins
// ...
func performDrop(info: DropInfo) -> Bool {
self.updating = false // << D&D finished
我正在测试 Asperi 对单元格重新排序的出色回答:
我遇到的问题是,当我只是进入拖动模式然后放置到位时,叠加层不会重置,请参见单元格 3:
我使用的是在答案中找到的确切代码。所以看起来像这样一行:
.overlay(dragging?.id == d.id ? Color.white.opacity(0.8) : Color.clear)
反应不正常?
知道如何让叠加层更新并返回 clear
吗?
实际上这是一个 SwiftUI 错误,因为在这种情况下 onDrag
被调用,但 onDrop
不是(从 D&D 流程的角度来看这是错误的)。
一个可能的解决方法是引入额外的 in-progress 状态来表明 D&D 真正开始了。 (其实我会想一些重构来简化delegate的接口,但是对于demo是可以的)
测试 Xcode 13.3 / iOS 15.4
更改如下:
@State private var isUpdating = false // in-progress state
// ...
.overlay(dragging?.id == d.id && isUpdating ? // << additional condition
Color.white.opacity(0.8) : Color.clear)
// ...
.onDrop(of: [UTType.text], delegate: DragRelocateDelegate(item: d, listData: $model.data,
current: $dragging, updating: $isUpdating)) // << transfer into delegate
// ...
func dropEntered(info: DropInfo) {
updating = true // << indicate that D&D begins
// ...
func performDrop(info: DropInfo) -> Bool {
self.updating = false // << D&D finished