SwiftUI 视图层次结构中较高的动画覆盖嵌套动画

Jam*_*ice 4 swift swiftui

我有一个 SwiftUI View,它有一个重复的动画onAppear。当该视图在包含另一个动画的视图层次结构中使用时,更高级别的动画将覆盖嵌套的动画。考虑以下基本示例:

struct Example: View {
  @State private var opacity: Double = 0

  var body: some View {
    Text("Example")
      .opacity(opacity)
      .onAppear() {
        withAnimation(Animation.easeInOut(duration: 2).repeatForever(autoreverses: true)) {
          self.opacity = 1
        }
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

当在类似于以下的上下文中使用它时,重复动画不会运行。如果我从此堆栈中删除动画,重复动画将按预期工作。

struct Parent: View {
  var body: some View {
    VStack {
      Example()
    }
    .animation(.easeInOut)
  }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能构造它以允许两个动画都工作?当子项添加到时,VStack它们应该根据该视图的动画属性进行动画处理,但它们也应该保留自己定义的动画。是否有一些关于动画及其之间的界限的文档我在某处遗漏了?

Asp*_*eri 6

您需要将内部动画链接到特定的状态变量,然后它将是独立的。

使用 Xcode 12 / iOS 14 进行测试

  var body: some View {
    Text("Example")
      .opacity(opacity)
      .animation(Animation.easeInOut(duration: 2).repeatForever(autoreverses: true), 
          value: opacity)            // << here !!
      .onAppear() {
          self.opacity = 1
      }
  }
Run Code Online (Sandbox Code Playgroud)