【发布时间】:2020-08-13 06:58:49
【问题描述】:
我正在尝试弄清楚如何在 SwiftUI 中检测到动画是否已完成,具体来说:一个 Spring() 动画。我的第一个想法是使用 GeometryReader 来检测下例中的 Circle 何时到达原点(偏移量 = .zero),但是这种方法有一个警告:Spring() 动画稍微超出了点它应该在哪里结束然后反弹回来。所以“动画结束”会在动画完成之前触发。
我做了一些研究,发现了另一种方法:SwiftUI withAnimation completion callback。但是,在此解决方案中,动画对象的偏移量与原点进行比较,因此与上述问题相同。
我可以使用计时器,但这不是一个优雅的解决方案,因为 Spring() 动画的持续时间会根据它的开始位置动态变化,所以不是这样。
在下面的示例中,我希望动画完成后圆圈变为绿色。
有没有办法解决这个问题?感谢您的帮助!
struct ContentView: View {
@State var offset: CGSize = .zero
@State var animationRunning = false
var body: some View {
VStack {
Circle()
.foregroundColor(self.animationRunning ? .red : .green)
.frame(width: 200, height: 200)
.offset(self.offset)
.gesture(
DragGesture()
.onChanged{ gesture in
self.offset = gesture.translation
}
.onEnded{_ in
self.animationRunning = true
withAnimation(.spring()){
self.offset = .zero
}
})
Spacer()
}
}
}
【问题讨论】:
标签: ios swift animation swiftui