经过一整天的尝试动画这些按钮,我给予了,并寻求帮助。我想动画正确的按钮只像这样:.rotation3DEeffect(.degrees(self.animationAmount),axis:(x:0,y:1,z:0)),同时使其他两个按钮淡出到25%不透明度。
当玩家点击错误的按钮时,我想像这样动画错误的按钮:.rotation3DEeffect(.degrees(self.animationAmount),axis:(x:l,y:l,z:1))(或者其他任何你能想到的表明灾难的东西),让其他两个单独呆着。
在此之后,我希望显示警报。
下面是我的代码。我评论了我想做什么,如果可能的话在哪里做。这一切都像我想要的那样工作,但无法让动画继续下去。
提前谢谢你的帮助
import SwiftUI
struct ContentView: View {
@State private var countries = ["Estonia", "France", "Germany", "Ireland", "Italy", "Nigeria", "Poland", "Russia", "Spain", "UK", "US"]
@State private var correctAnswer = Int.random(in: 0...2)
@State private var showingScore = false
@State private var scoreTitle = ""
@State private var userScore = 0
@State private var userTapped = ""
@State private var animationAmount = 0.0
var body: some View {
ZStack {
LinearGradient(gradient: Gradient(colors: [.blue, .black]), startPoint: .top, endPoint: .bottom)
.edgesIgnoringSafeArea(.all)
VStack(spacing: 20) {
VStack {
Text("Tap the flag of...")
.foregroundColor(.white).font(.title)
Text(countries[correctAnswer])
.foregroundColor(.white)
.font(.largeTitle).fontWeight(.black)
}
ForEach(0 ..< 3) { number in
Button(action: {
self.flagTapped(number)
if self.correctAnswer == number {
//animate the correct button only like this:
//.rotation3DEffect(.degrees(self.animationAmount), axis: (x: 0, y: 1, z: 0))
// and
// make the other two buttons fade out to 25% opacity
} else {
// animate the wrong button like this:
//.rotation3DEffect(.degrees(self.animationAmount), axis: (x: 1, y: 1, z: 1))
}
}) {
Image(self.countries[number])
.renderingMode(.original)
.clipShape(Capsule())
.overlay(Capsule().stroke(Color .black, lineWidth: 1))
.shadow(color: .black, radius: 2)
}
}
Text ("your score is:\n \(userScore)").foregroundColor(.white).font(.title).multilineTextAlignment(.center)
}
}
.alert(isPresented: $showingScore) {
Alert(title: Text(scoreTitle), message: Text("You chose the flag of \(userTapped)\nYour score is now: \(userScore)"), dismissButton: .default(Text("Continue")) {
self.askQuestion()
})
}
}
func flagTapped(_ number: Int) {
userTapped = countries[number]
if number == correctAnswer {
scoreTitle = "Correct"
userScore += 1
} else {
scoreTitle = "Wrong"
userScore -= 1
}
showingScore = true
}
func askQuestion() {
countries.shuffle()
correctAnswer = Int.random(in: 0...2)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
3条答案
按热度按时间relj7zay1#
我也有同样的问题。以下是我的解决方案(只有代码与你的不同):
Foreach:
警报:
两个功能:
你必须声明一些新的变量:)
希望我能帮上忙。
PS:在Youtube上有一个100DaysOfSwiftUI的播放列表,几乎每个任务都有解决方案。
https://www.youtube.com/watch?v=9AUGceRIUSA&list=PL3pUvT0fmHNhb3qcpvuym6KeM12eQK3T1
rkue9o1l2#
我在解决这个问题时遇到了和你类似的问题。我想出了一个不使用
DispatchQueue.main.asyncAfter
的解决方案。我做了以下作为最终解决方案:1.旋转360度的正确选择的旗帜,并淡出其他旗帜,以25%的不透明度。
1.用红色模糊错误旗帜的背景,并将其他旗帜淡出到25%的不透明度。
以下是完整的解决方案(我对实现上述解决方案的重要部分进行了评论):
基本上,我的解决方案是在Button视图之后的视图修饰符中添加三元操作符(例如,
.rotation3DEffect(...)
,.opacity(...)
和.background(...)
)。棘手的部分是正确合并检查条件。我更喜欢将
withAnimation
修饰符添加到flagTapped
函数中。在这个地方,如果用户选择了正确或错误的标志,我可以更好地控制动画。我对最初的挑战做了一个小改动:只需在视图中添加一个标记。
当用户按下正确和错误标志时的最终结果如下:
。
c7rzv4ha3#
这是一个老问题,但我想我还是找到了部分解决方案,这可能对未来的学生也有帮助。我的解决方案不是一个完美的,它是有点笨拙,但也许它可以帮助别人想出一个更好的。我从任务本身看到的是,你必须为每个按钮设置动画并淡出那些没有被点击的按钮。但是,如果您将动画应用于使用forEach创建的所有视图,并且它们都附加到同一个变量,则将为所有视图触发动画:我的解决方案是将这个动画变量拆分成一个带有标志索引的数组,并仅更改附加到已点击或未点击标志的变量。
这是我的完整代码:
}这些是解决方案部分:
这里我们创建两个具有相关值的数组变量
在ForEach视图中,我们调用将这些变量分配给每个动画修改器属性
设置延迟,这样我就可以显示动画之前,警报弹出,并改变不透明的其他标志,没有选择与循环