我有以下 SwiftUI 视图:
struct ContentView: View {
@State var model: Model
var body: some View {
ScrollView {
LazyVGrid(columns: columns, spacing: 10) {
ForEach(model.events, id: \.self) { event in
CardView(event: event)
}
.onMove { indices, newOffset in
model.events.move(fromOffsets: indices, toOffset: newOffset)
}
}
}
}
}
然而,似乎并没有onMove
正在执行闭包。我相信这是因为所有的手势都只给予ScrollView
所以内部视图不会收到手势。
我尝试将此视图转换为List
,但是我不想要行分隔符,我认为在 iOS 14 中这是不可能隐藏的。
所以,我想知道我需要更改什么才能允许用户拖放CardView
s 对它们重新排序。谢谢!
根据苹果的回复使用新的 LazyGrid 拖放来重新排序项目? https://developer.apple.com/forums/thread/650137
尽管您可以使用 View.onDrag(_:) 和
View.onDrop(...) 添加对手动拖放的支持。
如果您想查看内置重新排序功能,请提交反馈请求
支持。谢谢!
因此,在我的回答中提供了使用 .onDrag 和 .onDrop 的解决方案,以解决实际重复的问题https://stackoverflow.com/a/63438481/12299030 https://stackoverflow.com/a/63438481/12299030
主要思想是通过网格卡视图来跟踪药物和掉落,并在掉落委托中重新排序模型,因此 LazyVGrid 对子视图进行动画处理:
LazyVGrid(columns: model.columns, spacing: 32) {
ForEach(model.data) { d in
GridItemView(d: d)
.overlay(dragging?.id == d.id ? Color.white.opacity(0.8) : Color.clear)
.onDrag {
self.dragging = d
return NSItemProvider(object: String(d.id) as NSString)
}
.onDrop(of: [UTType.text], delegate: DragRelocateDelegate(item: d, listData: $model.data, current: $dragging))
}
}.animation(.default, value: model.data)
...
func dropEntered(info: DropInfo) {
if item != current {
let from = listData.firstIndex(of: current!)!
let to = listData.firstIndex(of: item)!
if listData[to].id != current!.id {
listData.move(fromOffsets: IndexSet(integer: from),
toOffset: to > from ? to + 1 : to)
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)