首页 > 解决方案 > 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
        }
      }
  }
}

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

struct Parent: View {
  var body: some View {
    VStack {
      Example()
    }
    .animation(.easeInOut)
  }
}

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

标签: swiftswiftui

解决方案


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

使用 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
      }
  }

推荐阅读