我有一个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())
}
}
}
当我进入编辑模式并将项目上移一个位置时,放下项目后会发生奇怪的动画(请参见下面的gif)。看起来被拖动的项目返回到其原始位置,然后再次移动到目标位置(带有动画)
有趣的是,如果将项目向下拖动到列表中或向上拖动多个位置,则不会发生。
我想这是因为即使状态列表中的项目已经通过拖放方式在 View 侧重新排序,但当状态中的项目重新排序时,List也会执行动画。但是显然,除了将项目向上移动一个位置以外,它在所有情况下都能很好地处理它。
关于如何解决此问题的任何想法?也许这是一个已知的错误?
我正在使用XCode 11.4.1,构建目标是iOS 13.4
(还请注意,在“现实世界”应用程序中,我使用的是Core Data,并且在移动项目时会在数据库中更新其顺序,然后更新状态,但是动画的问题看起来完全一样。)
最佳答案
这是解决方案(已通过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())
}
}
关于ios - 在SwiftUI列表中移动项目时不需要的动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61571422/