iOS开发SwiftUI

SwiftUI List Drag & Drop

有的时候,我们希望能通过拖拽List上的项目。调整List的顺序,用下面的代码可以简单的实现。

import SwiftUI

struct ContentView: View {
    @State private var fruits = ["Point1", "Point2", "Point3"]
    @State private var isEditable = false

    var body: some View {
        List {
            ForEach(fruits, id: \.self) { user in
                HStack(spacing: 20) {
                    Text(user).foregroundColor(.white)
                        .font(.largeTitle)
                        .frame(width: 200, height: 200).background(Color.green)
                    ScrollView(.horizontal) {
                        HStack(spacing: 20) {

                            ForEach(0..<10) {
                                Text("Item \($0)")
                                    .foregroundColor(.white)
                                    .font(.largeTitle)
                                    .frame(width: 200, height: 200)
                                    .background(Color.red)
                            }
                        }
                    }.allowsHitTesting(false) // 非常重要,阻止ScrollView的点击事件,否则会和List的冲突。

                }
            } .onMove(perform: move)
                // 长按时改变List的编辑模式。
                .onLongPressGesture {
                    withAnimation {
                        self.isEditable = true
                    }
            }
        }
// 通过设定environment的 editMode的值,来改变List的编辑模式。
.environment(\.editMode, isEditable ? .constant(.active) : .constant(.inactive))

    }

    func move(from source: IndexSet, to destination: Int) {
        fruits.move(fromOffsets: source, toOffset: destination)
        withAnimation {
            isEditable = false
        }
    }
}