Lottie 动画在 SwiftUI 的最后一个 TabView 页面上消失

Posted

技术标签:

【中文标题】Lottie 动画在 SwiftUI 的最后一个 TabView 页面上消失【英文标题】:Lottie animation disappears on last TabView page in SwiftUI 【发布时间】:2020-10-19 11:54:24 【问题描述】:

我有一个有六页的TabView。动画在最后一页。

当我查看最后一页时,动画会显示片刻然后完全消失。 认为这可能是动画的问题,但它在其他地方工作得很好。

我使用工作表呈现此TabView

最后一页:

struct SixScreen: View
    
    @EnvironmentObject var session: SessionStore
    
    @Binding var dismiss: Bool
    
    var body: some View
        VStack(spacing: 16)
            Spacer()
            LottieView(name: "complete")
                .frame(width: 200, height: 200, alignment: .center)
            Button(action: 
                dismiss.toggle()
            , label: 
                Text("Start")
                    .frame(width: 100, height: 50, alignment: .center)
                    .foregroundColor(.blue)
                    .background(Color.white)
                    .cornerRadius(10)
                    .shadow(color: .blue, radius: 5, x: 0, y: 1)
            )
            .padding(.bottom, 32)
            Spacer()
        
    

Lottie View 实现:

struct LottieView: UIViewRepresentable 
    
    func makeCoordinator() -> Coordinator 
        Coordinator(self)
    
    
    var name: String!
    var animationView = AnimationView()

    class Coordinator: NSObject 
        var parent: LottieView
    
        init(_ animationView: LottieView) 
            self.parent = animationView
            super.init()
        
    

    func makeUIView(context: UIViewRepresentableContext<LottieView>) -> UIView 
        let view = UIView()

        animationView.animation = Animation.named(name)
        animationView.contentMode = .scaleAspectFit
        animationView.loopMode = .loop
        
        animationView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(animationView)

        NSLayoutConstraint.activate([
            animationView.widthAnchor.constraint(equalTo: view.widthAnchor),
            animationView.heightAnchor.constraint(equalTo: view.heightAnchor)
        ])

        return view
    

    func updateUIView(_ uiView: UIView, context: UIViewRepresentableContext<LottieView>) 
        animationView.play()
    

标签视图:

Group
            TabView
                FirstScreen()
                SecondScreen()
                ThirdScreen()
                FourthScreen()
                FifthScreen()
                SixScreen(dismiss: $dismiss)
            
            .tabViewStyle(PageTabViewStyle())
            .indexViewStyle(PageIndexViewStyle(backgroundDisplayMode: .always))
            .padding(.bottom)
        
        .background(gradient)
        .edgesIgnoringSafeArea(.all)
        .navigationBarHidden(true)

【问题讨论】:

如果在updateUIView 中将animationView.play() 替换为context.coordinator.parent.animationView.play() 会发生什么? 我刚刚尝试过,所以其他人编写了这个代码,但不是运气。结果相同。 【参考方案1】:

尝试使用 .id() 修饰符强制刷新视图

struct AnimationView: View 
    
    @State private var lottieID = UUID()
    
    var body: some View 
        LottieView(name: "complete")
            .frame(width: 200, height: 200, alignment: .center)
            .id(lottieID)
            .onAppear 
                lottieID = UUID()
            
    

【讨论】:

【参考方案2】:

经过大量研究和测试,如果您希望在 SwiftUI TabView 中保持 Lottie 动画效果,您应该添加以下代码 sn-p:

 public func makeUIView(context: UIViewRepresentableContext<LottieView>) -> UIView 
    let view = UIView(frame: .zero)
    let animation = Animation.named(lottieFile)
    animationView.animation = animation
    animationView.animationSpeed = animationSpeed
    animationView.contentMode = .scaleAspectFit
    animationView.loopMode = loopMode
    animationView.backgroundBehavior = .pauseAndRestore <------

【讨论】:

以上是关于Lottie 动画在 SwiftUI 的最后一个 TabView 页面上消失的主要内容,如果未能解决你的问题,请参考以下文章

[UWP]缓存Lottie动画帧

ScrollView 中的动画缺少 SwiftUI 中的最后一个对象

Javascript动画插件lottie-web

Javascript动画插件lottie-web

Lottie 动画在项目中的使用总结

Lottie 动画在项目中的使用总结