我正在测试 Asperi 对单元格重新排序的出色答案:
SwiftUI |使用 onDrag 和 onDrop 对单个 LazyGrid 中的项目重新排序?
我遇到的问题是,当我简单地进入拖动模式然后放置到位时,覆盖层不会重置,请参见单元格 3:
我正在使用答案中找到的确切代码。所以看起来像这一行:
.overlay(dragging?.id == d.id ? Color.white.opacity(0.8) : Color.clear)
反应不正常?
知道如何使覆盖层更新并返回clear
?
实际上这是一个 SwiftUI bug,因为在这种情况下onDrag
被称为,但是onDrop
不是(从 D&D 流程的角度来看这是错误的)。
一个可能的解决方法是引入额外的进行中状态,以表明 D&D 真正开始。 (实际上我会考虑一些重构来简化委托的接口,但对于演示来说这是可以的)。
使用 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)