Нежелательная анимация при перемещении элементов в списке SwiftUI - PullRequest
1 голос
/ 03 мая 2020

У меня есть список SwiftUI, как в примере кода ниже.

struct ContentView: View {
    @State var numbers = ["1", "2", "3"]
    @State var editMode = EditMode.inactive

    var body: some View {
        NavigationView {
            List {
                ForEach(numbers, id: \.self) { number in
                    Text(number)
                }
                .onMove {
                    self.numbers.move(fromOffsets: $0, toOffset: $1)
                }
            }
            .navigationBarItems(trailing: EditButton())
        }
    }
}

Когда я вхожу в режим редактирования и перемещаю элемент на одну позицию вверх, странная анимация происходит после того, как я уронил элемент (см. Рисунок ниже). ). Похоже, что перетаскиваемый объект возвращается в исходное положение, а затем снова перемещается к месту назначения (с анимацией)

strange animation when reordering items

Что интересно, это не так происходит, если вы перетаскиваете элемент вниз по списку или более чем на одну позицию вверх.

Я полагаю, это происходит из-за того, что List выполняет анимацию, когда элементы в состоянии переупорядочиваются, даже если они уже были переупорядочены на стороне вида перетаскиванием и брось. Но, очевидно, он справляется с этим во всех случаях, кроме перемещения предмета на одну позицию вверх.

Есть идеи, как решить эту проблему? Или, может быть, это известная ошибка?

Я использую XCode 11.4.1 и цель сборки: iOS 13.4

(Обратите также внимание, что в приложении "реального мира" я При использовании Core Data и при перемещении элементов их порядок обновляется в БД, а затем обновляется состояние, но проблема с анимацией выглядит точно так же.)

1 Ответ

0 голосов
/ 03 мая 2020

Вот решение (протестировано с Xcode 11.4 / iOS 13.4)

var body: some View {
    NavigationView {
        List {
            ForEach(numbers, id: \.self) { number in
                HStack {
                    Text(number)
                }.id(UUID())        // << here !!
            }
            .onMove {
                self.numbers.move(fromOffsets: $0, toOffset: $1)
            }
        }
        .navigationBarItems(trailing: EditButton())
    }
}
...