ios - 在SwiftUI列表中移动项目时不需要的动画

标签 ios swift swiftui swiftui-list

我有一个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)。看起来被拖动的项目返回到其原始位置,然后再次移动到目标位置(带有动画)

strange animation when reordering items

有趣的是,如果将项目向下拖动到列表中或向上拖动多个位置,则不会发生。

我想这是因为即使状态列表中的项目已经通过拖放方式在 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/

相关文章:

swiftui - 如何在 SwiftUI 观察到的变量更改其值后立即触发操作

ios - 如何在 iOS 中将图像上传到 AWS S3?

ios - 快速:UIImageVIew 错误

ios - XCode 5 vs XCode 6 动画变化?

ios - 创建数学视频库应用程序。需要有关如何存储数据的建议

ios - 选择 x 编号来自长数组的项目并在表格 View 中滚动显示更多

ios - 如何使用核心数据将对象传递给 SwiftUI 中的其他 View

ios - 在SwiftUI中形成表单,使用swiftUI在IOS设置中定位用户图片

iphone - 获取错误类与键名的键值编码不兼容

ios - Facebook ios-sdk : feed post don't show on News Feed