我希望屏幕上有某种“徽章”,当条件满足时,它会反复从正常大小跳变到更大,然后回到正常大小,直到不再满足条件。我...
我希望屏幕上有一个“徽章”,当条件满足时,它会反复从正常大小弹跳到更大再回到正常大小,直到条件不再满足。但我似乎无法让徽章停止“弹跳”。 一旦开始,就无法停止。
我尝试过的方法: 我尝试过使用一些动画,但它们可以分为使用“repeatForever”来实现所需效果的动画和不使用“repeatForever”的动画。例如:
Animation.default.repeatForever(autoreverses: true)
和
Animation.spring(response: 1, dampingFraction: 0, blendDuration: 1)
(将阻尼设置为 0 可使其永远持续下去)
然后用 .animation(nil) 替换它。似乎不起作用。有人有什么想法吗?提前非常感谢!以下是重现它的代码:
struct theProblem: View {
@State var active: Bool = false
var body: some View {
Circle()
.scaleEffect( active ? 1.08: 1)
.animation( active ? Animation.default.repeatForever(autoreverses: true): nil )
.frame(width: 100, height: 100)
.onTapGesture {
self.active = !self.active
}
}
}
中的示例时也遇到了类似的问题 Hacking with Swift ,
.animation(active ? Animation.default.repeatForever() : Animation.default)
在 Xcode 13.2.1 上对我来说也不起作用。我找到的解决方案是将动画封装在自定义 ViewModifier 中。下面的代码说明了这一点;大按钮在活动和非活动动画之间切换。
`
struct ContentView: View {
@State private var animationAmount = 1.0
@State private var animationEnabled = false
var body: some View {
VStack {
Button("Tap Me") {
// We would like to stop the animation
animationEnabled.toggle()
animationAmount = animationEnabled ? 2 : 1
}
.onAppear {
animationAmount = 2
animationEnabled = true
}
.padding(50)
.background(.red)
.foregroundColor(.white)
.clipShape(Circle())
.overlay(
Circle()
.stroke(.red)
.scaleEffect(animationAmount)
.opacity(2 - animationAmount)
)
.modifier(AnimatedCircle(animationAmount: $animationAmount, animationEnabled: $animationEnabled))
}
}
}
struct AnimatedCircle: ViewModifier {
@Binding var animationAmount: Double
@Binding var animationEnabled: Bool
func body(content: Content) -> some View {
if animationEnabled {
return content.animation(.easeInOut(duration: 2).repeatForever(autoreverses: false),value: animationAmount)
}
else {
return content.animation(.easeInOut(duration: 0),value: animationAmount)
}
}
}
`
这可能不是最好的解决方案,但它确实有效。我希望它能帮助到一些人。