В 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))
}
}
}
}