【问题标题】:SwiftUI: How to get drag and drop reordering of items to work?SwiftUI:如何让项目的拖放重新排序工作?
【发布时间】:2020-10-23 19:58:53
【问题描述】:

我有以下 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 中无法隐藏。

所以,我想知道我需要更改哪些内容才能让用户拖放CardViews 以​​重新排序。谢谢!

【问题讨论】:

    标签: ios swift swiftui scrollview gesture


    【解决方案1】:

    根据苹果在Drag and Drop to reorder Items using the new LazyGrids?的回复

    虽然您可以使用 View.onDrag(_:) 和 View.onDrop(...) 添加对手动拖放的支持。

    如果您想查看内置重新排序,请提交反馈请求 支持。谢谢!

    因此,在我对https://stackoverflow.com/a/63438481/12299030 中实际重复的问题的回答中提供了使用 .onDrag 和 .onDrop 的解决方案

    主要思想是通过网格卡片视图跟踪药物和掉落并在 drop delegate 中重新排序模型,因此 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)
                }
            }
        }
    

    【讨论】:

      【解决方案2】:

      您可以使用列表并隐藏分隔符。

      .onAppear {
       UITableView.appearance().separatorStyle = .none
      }
      

      【讨论】:

      • 据我所知,这种行为在 iOS 14 中不再有效。另外,我想使用 Grid,而不是 List / Stack
      猜你喜欢
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多