Почему анимация / переход SwiftUI происходит мгновенно? - PullRequest
0 голосов
/ 08 мая 2020

Попытка создать представление навигации приложения, которое выполняет c push / pop анимацию с заданными представлениями. Основная анимация происходит в containedView(), где я показываю новый вид и скрываю текущий вид с помощью анимации. У меня проблема в том, что анимация происходит мгновенно, поэтому ее не происходит вообще.

Мне любопытно, как это отладить или есть ли у кого-нибудь рекомендации, как это исправить?

enum AppNavigationState
{
    case root
    case push(currentView: AnyView, newView: AnyView)
    case pop(currentView: AnyView, newView: AnyView)
}


class AppNavigationViewModel: ObservableObject {
    public var navigationStack: [AnyView]
    @Published public var navigationState: AppNavigationState

    init(rootView: AnyView) {
        navigationStack = [rootView]
        navigationState = AppNavigationState.root
    }

}

struct AppNavigationView: View {
    @ObservedObject var appNavigationViewModel: AppNavigationViewModel

    var body: some View {
        containedView()
    }

    private func containedView() -> AnyView {
        switch(appNavigationViewModel.navigationState) {
        case .root:
            return appNavigationViewModel.navigationStack.last!
        case let .pop(currentView, newView):
            return AnyView(ZStack {
                newView
                currentView
                    .transition(AnyTransition.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading)))
                    .animation(.easeOut)
            })
        case let .push(currentView, newView):
            return AnyView(ZStack {
                currentView
                newView
                    .transition(AnyTransition.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading)))
                    .animation(.easeOut)
            })
        }
    }

    public func pushView(view:AnyView) {
        if let currentView = appNavigationViewModel.navigationStack.last {
            appNavigationViewModel.navigationStack.append(view)
            appNavigationViewModel.navigationState = .push(currentView: currentView, newView: view)
        }
    }

    public func popView() {
        if (appNavigationViewModel.navigationStack.count > 1) {
            let currentView = appNavigationViewModel.navigationStack.removeLast()
            let newView = appNavigationViewModel.navigationStack.last!
            appNavigationViewModel.navigationState = .push(currentView: currentView, newView: newView)
        }
    }
}

enter image description here

...