swift - 在 SwiftUI 中使文本跳动
问题描述
所以我试图让一些文本淡入淡出以产生脉动类型的效果,这是我现在拥有的代码:
struct SignInView: View {
@State private var opacity: Double = 0.0
@State private var pulseDown: Bool = false
var body: some View {
VStack(alignment: .center) {
Spacer()
Button(action: {
AppDelegate.signInWithGoogle()
}, label: {
Text("Sign In")
.foregroundColor(Color.green)
.opacity(opacity)
})
Spacer()
}
.padding()
.onAppear {
self.pulsateText()
}
}
private func pulsateText() {
DispatchQueue.init(label: "Pulse").asyncAfter(deadline: .now() + 0.01) {
if self.pulseDown {
self.opacity -= 0.02
} else {
self.opacity += 0.02
}
if self.opacity > 1 {
self.pulseDown = true
} else if self.opacity < 0.1 {
self.pulseDown = false
}
self.pulsateText()
}
}
}
它完全符合我的要求并且看起来不错,但我不禁觉得无限递归循环不是正确的做法。我想我可以做一个无限的while而不是无限的递归,尽管这似乎仍然不理想。有没有更好的方法来实现这一目标?
解决方案
有一种更简单、更类似于 SwiftUI 的方式。它通过使用Animation
'srepeatForever(autoreverses:)
方法工作:
struct SignInView: View {
@State private var visible = true
var body: some View {
VStack {
Spacer()
Button(action: {
print("Sign in with Google")
// AppDelegate.signInWithGoogle()
}, label: {
Text("Sign In")
.foregroundColor(Color.green)
.opacity(visible ? 1 : 0)
})
Spacer()
}
.padding()
.onAppear(perform: pulsateText)
}
private func pulsateText() {
withAnimation(Animation.easeInOut.repeatForever(autoreverses: true)) {
visible.toggle()
}
}
}