gpt4 book ai didi

ios - SwiftUI 在 Spring() 动画完成后执行操作

转载 作者:行者123 更新时间:2023-12-01 15:32:55 24 4
gpt4 key购买 nike

我试图弄清楚如何在 SwiftUI 中检测动画是否已完成,具体来说:Spring() 动画。我的第一个想法是使用 GeometryReader 来检测下面示例中的 Circle 何时到达原点(偏移 = .zero),但是这种方法有一个警告:Spring() 动画有点超出原点它应该结束的地方然后反弹。所以“动画结束”将在动画完成之前触发。
我做了一些研究,发现了另一种方法:SwiftUI withAnimation completion callback .但是,在此解决方案中,动画对象的偏移量与原点进行了比较,因此与上述问题相同。
我可以使用计时器,但这不是一个优雅的解决方案,因为 Spring() 动画的持续时间根据它开始的位置动态变化,所以这不是方法。
在下面的示例中,我希望圆圈在动画完成后变为绿色。
有没有办法解决这个问题?感谢您的帮助!
enter image description here

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()
}
}
}

最佳答案

默认动画持续时间(对于那些没有明确持续时间参数的动画)通常是 0.25-0.35(独立于它的启动位置和平台),所以在你的情况下它是完全安全的(用 Xcode 11.4/iOS 13.4 测试)使用以下方法:

withAnimation(.spring()){
self.offset = .zero
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
self.animationRunning = false
}
}
注意:您可以调整 0.5 延迟,但对于人眼来说差异并不显着。

关于ios - SwiftUI 在 Spring() 动画完成后执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63389734/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com