如何在没有动画的情况下更新SwiftUI列表

时间:2019-06-10 21:03:44

标签: ios swift swiftui

我想更新一个SwiftUI列表而没有任何插入动画。 我的List@EnvironmentObject获取数据 我已经尝试将List本身和PassthroughSubject.send()包装在withAnimation(.empty)块中,但这无济于事。

一个非常肮脏的解决方法是调用UIView.setAnimationsEnabled(false)(是的,UIKit对SwiftUI产生了影响),但是必须有一种类似于SwiftUI的方式来设置自定义插入动画。

3 个答案:

答案 0 :(得分:7)

这可行,只需将.id(UUID())放在列表的末尾

List {
    // for each etc
}.id(UUID())

UIKit的类似reloadData的排序

答案 1 :(得分:1)

虽然DogCoffee提供的答案有效,但是这样做的效率很低。有时,我们确实不得不通过效率低下来迫使系统执行我们想要的操作。对于SwiftUI中的隐式动画,有一种更好的方式来禁用它们。

使用SwiftUI中的Transaction机制,我们可以定义一个可以应用于任何视图的扩展。这将禁用视图和所有子级的动画。

对于列表视图示例,这避免了用新的但相同的副本替换列表中的所有数据。

extension View {
     
    func animationsDisabled() -> some View {
        return self.transaction { (tx: inout Transaction) in
            tx.disablesAnimations = true
            tx.animation = nil
        }.animation(nil)
    }
}

尝试将此扩展名应用于您的列表或包含父视图的视图。您可能需要尝试找出哪种视图才是理想的。

List {
    // for each etc
}.animationsDisabled()

答案 2 :(得分:0)

.animate(nil)

您可以在https://developer.apple.com/tutorials/swiftui/animating-views-and-transitions

上找到更多信息。