SwiftUI:如何在更新父视图状态之前使用 @Binding 变量更新子视图?

时间:2021-06-12 19:35:02

标签: swift animation swiftui uiviewcontroller uiviewanimation

我有一个基本设置,可以使用下面的代码在我的 ContentView 上显示另一个视图。

struct ContentView: View {
  @State var otherViewShowing: Bool = true

  var body: some View {
    if otherViewShowing {
        OtherView(amIShowing: $otherViewShowing)
    } else {
        Text("Hello, world!")
    }
  }
}

但是,当我通过更改 OtherView 中按钮中的“amIShowing”将“otherViewShowing”变量设置为 false 时,视图突然消失并且文本“Hello, world!”立即显示。我试图让 OtherView 在更新 ContentView 以显示“Hello, world!”之前播放缩小动画。所以比较流畅。

struct OtherView: View {
  @Binding var amIShowing: Bool
  @State private var scaleAmount: CGFloat = 1

  var body: some View {
      VStack {
          Button("Tap me") {
              withAnimation(.default) {
                  amIShowing = false
                  scaleAmount = 0
              }
          }
      }
      .scaleEffect(scaleAmount)
  }
}

对实现这一点有什么想法吗?提前致谢。

1 个答案:

答案 0 :(得分:0)

enter image description here

您可以为此指定持续时间和延迟。

延迟:将动画延迟 2 秒。

持续时间:确定动画的持续时间。

VStack {
    Button("Tap me") {
       withAnimation(Animation.easeIn(duration: 2).delay(2)) {
                 amIShowing = false
                 scaleAmount = 0
          }
        }
      }
      .scaleEffect(scaleAmount)