La temporización de animación de SwiftUI .delay es incorrecta después de salir y volver a la vista.
Esta animación funciona correctamente cuando se visualiza por primera vez, pero el tiempo se desajusta al azar cuando se sale y vuelve a entrar en la aplicación (o si se navega fuera de la pantalla y se vuelve a ella). ¿Cómo se puede cambiar este código para mantener la sincronización de la animación después de salir de la pantalla y volver?
Este error se puede reproducir saliendo y volviendo a entrar en la aplicación varias veces.
import SwiftUI
struct ExampleView: View {
@State var isAnimating: Bool = false
let timing = 4.0
let maxCounter: Int = 3
var body: some View {
ZStack {
Circle()
.stroke(
Color.blue.opacity(isAnimating ? 0.0 : 1.0),
style: StrokeStyle(lineWidth: isAnimating ? 0.0 : 15.0))
.scaleEffect(isAnimating ? 1.0 : 0.0)
.animation(
Animation.easeOut(duration: timing)
.repeatForever(autoreverses: false)
.delay(Double(0) * timing / Double(maxCounter) / Double(maxCounter)), value: isAnimating)
Circle()
.stroke(
Color.blue.opacity(isAnimating ? 0.0 : 1.0),
style: StrokeStyle(lineWidth: isAnimating ? 0.0 : 15.0))
.scaleEffect(isAnimating ? 1.0 : 0.0)
.animation(
Animation.easeOut(duration: timing)
.repeatForever(autoreverses: false)
.delay(Double(1) * timing / Double(maxCounter) / Double(maxCounter)), value: isAnimating)
Circle()
.stroke(
Color.blue.opacity(isAnimating ? 0.0 : 1.0),
style: StrokeStyle(lineWidth: isAnimating ? 0.0 : 15.0))
.scaleEffect(isAnimating ? 1.0 : 0.0)
.animation(
Animation.easeOut(duration: timing)
.repeatForever(autoreverses: false)
.delay(Double(2) * timing / Double(maxCounter) / Double(maxCounter)), value: isAnimating)
}
.frame(width: 200, height: 200, alignment: .center)
.onAppear {
isAnimating = true
}
}
}
davy.ai
Una posible solución para mantener la sincronización del tiempo de la animación después de salir y regresar a la pantalla es eliminar el modificador
onAppear
y reemplazarlo por el modificadoronReceive
que escucha los cambios en el estadoisAnimating
.Esto asegura que la animación se inicie o reinicie cuando se muestra la vista o cuando cambia el estado
isAnimating
, independientemente de si la vista se mostró previamente o no.Aquí está el código modificado:
En este código modificado, el estado
isAnimating
solo se actualiza cuando cambia el valor del publicadorisAnimating
. Esto garantiza que la animación se inicie o reinicie cada vez que cambia el estadoisAnimating
, independientemente de si la vista se mostró previamente o no.Con este cambio, la animación debería ejecutarse de manera consistente incluso después de que se salga y entre en la aplicación o si se navega lejos de la pantalla y se vuelve a ella.