【发布时间】:2022-01-05 09:07:50
【问题描述】:
如何根据需要为各个按钮添加修饰符?
我有一个ForEach 循环在0..<5 的范围内运行,并且我需要在单击的按钮中添加.rotation3DEffect 的动画,并根据它们的状态在剩余的未单击按钮上添加另一个.opacity。
注意:我可以观察按钮操作中的任何状态值,然后将其更改为具有动画,但由于修改器已应用于
Button本身在ForEach循环内,我正在播放动画 应用于 foreach 中的每个按钮。
@State private var rotationDegree = 0.0
@State private var selectedNum = 0
@State private var correctAnswer = 0 // comes from saved data
var body: some View {
ForEach(0..<5) { num in // image as a button, loops through their prefix name
Button {
selectedNum = (num == correctAnswer) ? num : 0
withAnimation {
// once clicked, will animate all 5 buttons, need only this clicked button to animate.
if (num == correctAnswer) {
rotationDegree += 360
}
}
} label: {
Image("imageName\(num)")
}
.rotation3DEffect((.degrees((selectedNum == correctAnswer) ? rotationDegree : 0.0)), axis: (x: 0, y: (selectedNum == correctAnswer) ? 1 : 0, z: 0)) // animation I want to add to a specific button
}
}
【问题讨论】:
-
这能回答你的问题吗? SwiftUI - Popover in ForEach Loop
-
不,我要添加一个代码示例
-
ForEach 中的所有内容都需要进入自己的视图,因此每个循环都有自己的状态,这是相同的答案。在你的情况下 num 将是一个参数
-
你能详细说明一下吗,你说的我不明白; ..进入自己的视野..
-
您以错误的方式看待问题。您没有与 5 个
Buttons 共享Button共享@State,因此您需要5 个@State来单独控制它们。创建一个 SwiftUIView,它的body中包含ForEach的content中的所有代码,它还将具有用于控制动画的@State,以及用于num的参数。跨度>
标签: animation button foreach swiftui modifier