Я не знаю, как остановить withAnimation(_:)
метод после его запуска.
Я пишу свое первое приложение с SwiftUI и хочу создать круг выполнения, который будет управляться кнопками пользователем- кнопка запуска, которая запускает анимацию, где кружок будет незаполнен в конце, а кнопка остановки должна будет сохранять фактическое состояние точки заливки и останавливать анимацию.
Мой основной вид:
struct MainView: View {
@State private var fillPoint = 1.0
@State private var animationDuration = 10.0
private var ring: Ring {
let ring = Ring(fillPoint: self.fillPoint)
return ring
}
var body: some View {
VStack {
ring.stroke(Color.red, lineWidth: 15.0)
.frame(width: 200, height: 200)
.padding(40)
HStack {
Button(action: {
withAnimation(.easeIn(duration: self.animationDuration)) {
self.fillPoint = 0
}
}) {
Text("Start")
}
Button(action: {
// what should I do here?
}) {
Text("Stop")
}
}
}
}
}
И структура Ринга:
struct Ring: Shape {
var startArcAngle: Double = 360.0
var fillPoint: Double {
willSet {
startArcAngle = 360 * newValue
}
}
internal var animatableData: Double {
get { return fillPoint }
set { fillPoint = newValue }
}
internal func path(in rect: CGRect) -> Path {
let endArcAngle = 0.0
var path = Path()
path.addArc(center: CGPoint(x: rect.size.width / 2,
y: rect.size.height / 2),
radius: rect.size.width / 2,
startAngle: .degrees(startArcAngle - 90),
endAngle: .degrees(endArcAngle - 90),
clockwise: true)
return path
}
}
Я пытался манипулировать значением animatableData
, но вне структуры Ринга он всегда возвращает 0.0 (значение, которое мой код будет достигать в конце анимацииесли он запущен) и внутри структуры Ring он печатается так, как мне хотелось бы (0.96xxxx -> 0.94xxxx и т. д.), но если взять это вне структуры Ring, всегда возвращается 1.0 или 0.0.