代码之家  ›  专栏  ›  技术社区  ›  Mozahler

如何在SwiftUI中通过点击按钮一次设置一个更改的动画?

  •  2
  • Mozahler  · 技术社区  · 2 年前

    我有一个循环,在其中我更新一个值来更改视图。 在本例中,我希望更新一次发生一次,以便您看到它在行中波动,但它们都是同时发生的。

    struct AnimationQuestion: View {
       @State var colors = "🟪🟨🟧🟦🟥🟫⬛️🟩⬜️".map { String($0) }
       @State var reversedColors = "⬜️🟩⬛️🟫🟥🟦🟧🟨🟪".map { String($0) }
    
       var body: some View {
          VStack {
             Spacer()
             Button("Tap") {
                let temp = colors
                for i in 0 ..< colors.count {
                   withAnimation(.linear(duration: 4.0)) {
                      colors[i] = reversedColors[i]
                   }
                }
                reversedColors = temp
                
             }
             Spacer()
    
             HStack {
                ForEach(Array(colors.enumerated()), id: \.0) { index, color in
                   Text(color).tag(index)
                }
             }
             Spacer()
          }
       }
    }
    
    struct QuestionPreview: PreviewProvider {
       static var previews: some View {
          AnimationQuestion()
       }
    }
    
    

    我希望这些行按顺序(明显地)执行动画:

        withAnimation(.linear(duration: 4.0)) {
             colors[i] = reversedColors[i]
        }
    
    1 回复  |  直到 2 年前
        1
  •  2
  •   Asperi    2 年前

    您通过索引进行标识 \.0 ,但索引在反转后不会更改,因此刷新是即时的,而需要通过颜色值进行标识 \.1 (在这种情况下,它们是唯一的)。

    这里有一个补丁

    enter image description here

    ForEach(Array(colors.enumerated()), id: \.1) { index, color in
       Text(color).tag(index)
    }