当应用处于后台/前台时暂停/恢复动画

时间:2021-03-29 18:09:56

标签: swift swiftui

我有一个 SwiftUI 应用,其中有一朵云在屏幕上缓慢移动,然后重置到其起始位置并无限地再次开始动画。

我使用以下代码完成此操作:

import SwiftUI

struct Clouds {
    @State private var xOffset: CGFloat = 0.0
    @State private var yOffset: CGFloat = 0.0

    var body: some View {
        Image("cloud") 
           .resizable()
           .scaledToFit()
           .aspectRatio(contentMode: .fit)
           .frame(height: 200.0)
           .offset(x: xOffset, y: yOffset)
           .onAppear {
               DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
                   yOffset = MainData.screenHeight * CGFloat.random(in: 0...1)
                   
                   withAnimation(Animation.linear(duration: 80).repeatForever(autoreverses: false)){
                       xOffset = MainData.screenWidth
                   }
               }
          }
    }
}

期望的行为:当应用被发送到后台时,云应该停止移动——当应用被带到前台时,云应该从哪里恢复它的移动它停止了

实际行为:当应用发送到后台时,云会继续动画。动画完成,然后云保持在其起始位置,直到应用程序被带到前台。

问题:如何才能让动画在应用发送到后台时暂停,并在应用进入前台时恢复?

谢谢!

1 个答案:

答案 0 :(得分:0)

作为一种解决方法,我决定通过 SpriteKit 而不是 SwiftUI 来渲染云。默认情况下,SpriteKit 具有所需的行为:当应用程序离开前台时,云停止动画,当应用程序返回前台时,云从相同位置开始动画。

如果其他人可以回答 SwiftUI 的原始问题,那就太好了——所以我不会接受我自己的答案。