Почему я не вижу свою анимацию, когда пользователь входит в систему?

#swiftui #uiviewanimation #onappear

#swiftui #uiviewanimation #onappear

Вопрос:

Я создал пользовательский экран запуска, который хорошо работает, когда пользователь не вошел в систему, но если он вошел в систему, мы не видим анимацию (просмотр переходит прямо к главному просмотру и не ждет завершения анимации).

У вас есть какие-либо идеи, почему?

 import SwiftUI

struct LaunchScreen: View {
    @EnvironmentObject var session: SessionStore
    @State private var animationDone = false
    @State private var rotation = 0.0
    
    func getUser () {
        session.listen()
    }
    
    var body: some View {
        Group{
            if (session.session != nil amp;amp; animationDone) {
                Home()
            }
            else if (session.session == nil amp;amp; animationDone) {
                Login()
            }
            else {
                ZStack {
                    Color(#colorLiteral(red: 0.259467423, green: 0.5342320204, blue: 0.7349982858, alpha: 1))
                    VStack {
                        HStack (alignment: .center, spacing: 0, content: {
                            
                            Text("Se")
                                .foregroundColor(.white)
                                .font(.system(size: 40))
                            Text("e")
                                .foregroundColor(.white)
                                .font(.system(size: 40))
                                .rotation3DEffect(Angle(degrees: rotation), axis: (x: 0, y: 1, z: 0))
                        })
                    }
                }.edgesIgnoringSafeArea(.all)
            }
        }
        .onAppear{
            withAnimation(Animation.easeInOut(duration: 1)){
                rotation  = 180
            }
            withAnimation(Animation.linear.delay(1.5)){
                animationDone = true
            }
        }
        .onAppear(perform: getUser)
    }
}

 

Комментарии:

1. Поскольку Home находится в верхней части вашего условия, вы видите всплеск только тогда, когда ни одно из условий не выполняется. Если вы хотите запустить свою заставку, несмотря ни на что, уберите ее из условного обозначения и / или поместите вверху.

2. Хммм, это не работает, и анимация нарушена вашим предложением…

Ответ №1:

В этом случае решение состоит в том, чтобы отложить DispatchQueue , например

     }
    .animation(.linear, value: animationDone)             // << this !!
    .onAppear{
        withAnimation(Animation.easeInOut(duration: 1)){
            rotation  = 180
        }
        DispatchQueue.main.asyncAfter(deadline: .now()   1.5) {
            animationDone = true                         // << and this !!
        }
    }