我想更新一个SwiftUI列表而没有任何插入动画。
我的List
从@EnvironmentObject
获取数据
我已经尝试将List
本身和PassthroughSubject.send()
包装在withAnimation(.empty)
块中,但这无济于事。
一个非常肮脏的解决方法是调用UIView.setAnimationsEnabled(false)
(是的,UIKit对SwiftUI产生了影响),但是必须有一种类似于SwiftUI的方式来设置自定义插入动画。
答案 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
上找到更多信息。