如何解决在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()
}
}
}
它确实可以实现我想要的并且看起来不错,但是我忍不住觉得无限递归循环不是正确的方法。我想我可以做一个无限的时间来代替无限的递归,尽管那似乎还是不理想的。有没有更好的方法来实现这一目标?
解决方法
有一种更简单的类似SwiftUI的方式。通过使用Animation
的repeatForever(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()
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。