SwiftUI withAnimation(_:_:) 函数没有动画

问题描述 投票:0回答:1

我无法使用

withAnimation(_:_:)
函数迁移简单的动画:

struct WelcomeView: View {

  let greetingTexts: [String]

  @ViewBuilder
  var body: some View {
    VStack {
      ForEach(greetingTexts.indices, id: \.self) { index in
        Text(greetingTexts[index])
            .font(.mtgSans(.title1))
            .multilineTextAlignment(.center)
            .transition(.opacity)
            .animation(Animation.easeOut.speed(0.5).delay(0.08 * Double(index)))
      }
    }
  }
}

对此:

  struct WelcomeView: View {

    let greetingTexts: [String]

    @ViewBuilder
    var body: some View {
      VStack {
        ForEach(greetingTexts.indices, id: \.self) { index in
          withAnimation(.easeOut.speed(0.5).delay(0.08 * Double(index))) {
            Text(greetingTexts[index])
              .font(.mtgSans(.title1))
              .multilineTextAlignment(.center)
              .transition(.opacity)
          }
        }
      }
    }
  }

而且它根本没有动画。有线索吗?

swift animation swiftui
1个回答
0
投票

您可以利用 SwiftUI 的动画和不透明度修改器为 VStack 中的每个项目设置延迟动画文本。

这是一个例子:

import SwiftUI

struct WelcomeView: View {
    let greetingTexts: [String]

    var body: some View {
        VStack {
            ForEach(greetingTexts.indices, id: \.self) { index in
                Text(greetingTexts[index])
                    .font(.title)
                    .multilineTextAlignment(.center)
                    .opacity(1) // Full opacity for smooth animation
                    .animation(
                        Animation.easeOut
                            .speed(0.5)
                            .delay(0.08 * Double(index)),
                        value: greetingTexts
                    )
            }
        }
    }
}

解释

ForEach with Index:使用 .indices 访问每个元素的索引以计算延迟。 不透明度修改器:从 0 开始初始不可见,然后动画到 1。 动画修改器:对每个文本使用 0.08 * Double(index) 应用延迟。

用法

struct ContentView: View {
    var body: some View {
        WelcomeView(greetingTexts: ["Hello", "Welcome!", "Let's Animate!"])
    }
}

当视图出现时,这将以交错延迟的方式为每个文本设置动画。如果您需要进一步说明,请告诉我! 😊

© www.soinside.com 2019 - 2024. All rights reserved.