如何在ForEach中定位单个视图

时间:2020-01-03 04:45:40

标签: ios swift swiftui

我是iOS开发人员的新手,目前我正试图找出如何定位在ForEach循环中创建的单个View的方法。

基本上我有三种形状(标志),我想添加一下功能:当轻击标志时,标志可以旋转360度。我有动画(旋转)部分,但我的问题是我无法弄清楚如何定位被点击的单个标志,而是由所有三个标志执行动画。

ForEach(0 ..< 3, id: \.self) { number in

                    Button(action: {
                        self.flagTapped(number)

                        withAnimation {
                            self.animationAmount += 360
                        }

                        self.askQuestion()

                    }) {
                        FlagImage(name: self.countries[number], number: number)
                    }
                    .rotation3DEffect(.degrees(self.animationAmount), axis: (x: 0, y: 1, z: 0))
                }

到目前为止,这是我的代码,它所做的就是我之前解释的内容,它可以进行360度旋转,但是对于所有三个标志(而不是正在被点击的三个标志),我也尝试使用onTapGesture进行操作,但是没有似乎有效。谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这是一个演示如何实现的示例(由于缺少自定义值,我在快照中使用了一些标准的东西,但是这个主意应该很明显)。

SwiftUI rotate clicked button

struct TestTargetButton: View {
    let countries = ["shield", "triangle", "square"]

    @State var selection: Int? = nil
    @State var animationAmount: Double = 0
    var body: some View {
        HStack {
            ForEach(0 ..< 3, id: \.self) { number in

                Button(action: {
                    self.selection = number
                    withAnimation {
                        self.animationAmount += 360
                    }
                }) {
                    Image(systemName: self.countries[number])
                        .resizable()
                        .frame(width: 50, height: 50)
                        .padding()
                }
                .rotation3DEffect(.degrees(self.selection == number ? self.animationAmount : 0), axis: (x: 0, y: 1, z: 0))
            }
        }
    }
}