SwiftUI:动画列表中的更改而不动画内容更改

Bla*_*olf 11 swift watchos swiftui swiftui-list

我在 SwiftUI 中有一个简单的应用程序,它显示 a List,每个项目都是 a ,VStack包含两个Text元素:

var body: some View {
    List(elements) { item in
        NavigationLink(destination: DetailView(item: item)) {
            VStack(alignment: .leading) {
                Text(item.name) 
                Text(self.distanceString(for: item.distance))
            }
        }
    }
    .animation(.default)
}
Run Code Online (Sandbox Code Playgroud)

.animate()之所以在那里,是因为我想在elements数组更改时对列表的更改进行动画处理。不幸的是,SwiftUI 还会对内容的任何更改进行动画处理,从而导致奇怪的行为。例如,Text每个项目中的第二个更新非常频繁,现在更新将...在更新到新内容之前很快显示被截断的标签(在末尾)。

那么如何在更新列表内容时防止这种奇怪的行为,但在列表中的元素发生变化时保持动画呢?

如果相关,我正在创建一个 watchOS 应用程序。

Asp*_*eri 17

以下应该禁用行内部的动画

VStack(alignment: .leading) {
    Text(item.name) 
    Text(self.distanceString(for: item.distance))
}
.animation(nil)
Run Code Online (Sandbox Code Playgroud)

  • 我在“ForEach”中使用“List”,并且“.animation(nil)”句子不适用于行 (2认同)

Bre*_*ett 10

@Asperi 的回答也解决了我遇到的问题(一如既往地支持他的回答)。

我在使用以下内容为整个屏幕设置动画时遇到了一个问题: AnyTransition.asymmetric(insertion: .move(edge: .bottom), removal: .move(edge: .top))

并且所有的 Text() 和 Button() 子视图也以奇怪且不那么美妙的方式进行动画处理。看到 Asperi 的回答后,我使用 animation(nil) 来解决这个问题。然而,问题是我的按钮不再在选择时动画,以及我想要的其他动画。

所以我添加了一个新的 State 变量来打开和关闭 VStack 的动画。默认情况下它们是关闭的,在屏幕上显示动画后,我会在一小段延迟后启用它们:

struct QuestionView : View {
    @State private var allowAnimations : Bool = false

    var body : some View {
        VStack(alignment: .leading, spacing: 6.0) {
            Text("Some Text")

            Button(action: {}, label:Text("A Button")
        }
        .animation(self.allowAnimations ? .default : nil)
        .onAppear() {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
                self.allowAnimations = true
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

只需为与我有类似问题并需要建立在 Asperi 出色答案基础上的任何人添加此内容。

  • .animation(:value:) 调用允许您将动画仅与值更改联系起来,而不是在魔法秒内禁用视图。 (4认同)
  • 最近也发现了这个@Beginner,但不要告诉所有人,因为它有损于我上面的出色答案;-) (3认同)
  • 阴谋:对答案和评论进行投票,每个人都会获胜并学习。呵呵... .default 作为停止重复动画的工具是很好的。 (3认同)