SwiftUI анимация / переход наложения не работает - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь сделать что-то вроде этого:

VStack { 
   content()
}
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
.overlay(
   MyView()
   .transition(.asymmetric(insertion: .move(edge: .top), removal: .opacity))
   .animation(.easeInOut)
)

По какой-то причине MyView не анимирован.У кого-нибудь есть решение для этого?

1 Ответ

0 голосов
/ 27 сентября 2019

В SwiftUI вы указываете своему приложению, как вы хотите, чтобы ваш интерфейс выглядел для данного состояния.Затем, если ваше состояние изменяется, SwiftUI делает все возможное, чтобы перейти от отображения состояния 1 к отображению состояния 2.

В этом случае вы сказали SwiftUI, что вы хотите VStack с наложенным сверху MyView и что если есть анимация, вы хотите, чтобы у нее был такой-то переход и стиль анимации.Но поскольку вы предоставили только одно состояние приложения, между двумя анимированными состояниями нет.

Следующий пример кода должен проиллюстрировать то, что я предполагаю, что вы пытаетесь сделать:

struct ContentView: View {
    // We have two states - the border rectangle is shown, or not shown
    // @State allows SwiftUI to know to redraw anything that changes when this variable changes
    @State private var showingOverlay = false

    var body: some View {
        // We lay our root view down first, and the border rectangle on top using ZStack
        ZStack {
            // VSTack likes to shrink down as small as it's content allows
            VStack {
                Text("Hello World")
            }
                // .background() is kind of an implicit ZStack, which lets other content
                //    flow around the VStack like it had the Rectangle's dimensions
                .background(
                    Rectangle()
                        .fill(Color.gray)
                        .frame(width: 300, height: 300)
                )
                // When the VStack appears (when your app launches), set the showingOverlay variable to true
                // Two seconds later, set it back to false
                .onAppear {
                    self.showingOverlay.toggle()
                    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
                        self.showingOverlay.toggle()
                    }
            }

            // We only show this Rectangle if the showingOverlay variable is true
            // Since we are transitioning from not showing, to showing, to not showing, SwiftUI will animate
            if showingOverlay {
                Rectangle()
                    .stroke(Color.blue, lineWidth: 5)
                    .frame(width: 300, height: 300)
                    .transition(.asymmetric(insertion: .move(edge: .top), removal: .opacity))
                    .animation(.easeInOut(duration: 1))
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...