Попытка создать представление навигации приложения, которое выполняет 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](https://i.stack.imgur.com/jsLeR.gif)