Здесь возможен подход (протестировано и работает с Xcode 11.2 / iOS 13.2):
1) Вам необходимо указать animatableData
для вашей фигуры, как показано ниже
struct PieShape: Shape {
var progress: Double = 0.0
var animatableData: Double {
get {
self.progress
}
set {
self.progress = newValue
}
}
...
2) затем добавьте анимацию к Circle
Circle()
.stroke(Color.gray, lineWidth: 1)
.frame(width: geometry.size.width, height: geometry.size.width, alignment: .center)
.padding()
.overlay(
PieShape(progress: Double(self.progress))
.frame(width: geometry.size.width - 10, height: geometry.size.width - 10 , alignment: .center)
.foregroundColor(.blue)
)
.animation(Animation.linear) // << here !!
и все. Для тестирования (только!) Вы можете добавить следующее в PieProgress
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
self.progress = 0.72
}
}
Примечание: для использования PieProgress
в качестве повторно используемого компонента было бы разумно сделать progress
как @Binding
, просто в случай.