Анимация перехода SwiftUI применяется к элементам Inside View отдельно

У меня очень странная проблема с переходами/анимацией SwiftUI. Мое намерение состоит в том, чтобы перемещать целые представления внутрь или наружу, но кажется, что анимация применяется к элементам внутри представления отдельно, а также ко всему представлению. Результат очень странный и неприятный — текст и кнопка внутри представления в конечном итоге движутся с разной скоростью и отдельно, тогда как они должны быть зафиксированы на месте и перемещаться вместе с родительским представлением. Может ли кто-нибудь объяснить, почему это происходит? Спасибо!

Entrypoint.swift

      import SwiftUI

enum Page {
    case login, onboarding, home
}

struct Entrypoint: View {
    @State var onboarding: Bool = true
    @State var page: Page = .login
    
    func finishLogin() {
        page = .onboarding
    }

    func finishOnboarding() {
        page = .home
    }
    
    // Slide transition
    let transition = AnyTransition.asymmetric(insertion: .move(edge: .trailing), removal: .offset(x: -24))

    var body: some View {
        ZStack {
            switch page {
            case .login:
                LoginView(finish: finishLogin)
                    .transition(transition)
            case .onboarding:
                OnboardingView(finish: finishOnboarding)
                    .transition(transition)
            case .home:
                RootView()
                    .transition(transition)
            }
        }.animation(.easeInOut, value: page)
    }
}

LoginView.swift

      import SwiftUI

struct LoginView: View {
    var finish: () -> Void

    init(finish: @escaping () -> Void) {
        self.finish = finish
    }
    
    var body: some View {
        VStack {
            Group {
                Text("Hello, World!")
                
                Button(action: {
                    finish()
                }) {
                    Text("Login")
                }
            }.frame(minWidth: 0, maxWidth: .infinity)
            
        }.background(Color.green)
        .frame(minWidth: 0, maxWidth: .infinity)
    }
}

0 ответов

Другие вопросы по тегам