existe-t-il un moyen dans SwiftUI de changer le comportement standard de NavigationView/NavigationLink, qui consiste à passer d'une vue à l'autre? J'aimerais avoir une animation/transition personnalisée comme un fondu entrant/sortant.
J'essaye les choses depuis un moment maintenant et j'en ai résolu la moitié, mais j'ai du mal avec la seconde moitié. Ce code:
struct ContentView: View {
@State var appeared: Double = 0.0
var body: some View {
NavigationView {
VStack {
Text("\(appeared)")
NavigationLink(destination: ViewB()) {Text("go to View B")}
}
.opacity(appeared)
.animation(Animation.easeInOut(duration: 3.0), value: appeared)
.onAppear {self.appeared = 1.0}
.onDisappear {self.appeared = 0.0}
}
}
}
Fonctionne correctement lorsque la vue apparaît. Il apparaît en changeant l'opacité à 1.0 en 3 secondes. Tout bon. Mais lorsque vous cliquez sur NavigationLink
, pour accéder à la vue B, il fait glisser cette vue et la vue B (qui a la même logique) apparaît lentement. Je suppose que c'est parce que onDisappear
est réellement déclenché lorsque la vue a disparu, pas lorsqu'elle est sur le point de s'éloigner.
Y a-t-il des chances de dire à SwiftUI de ne pas glisser ou glisser mais de faire une animation/transition personnalisée?
J'utilise Xcode 11.2.1
C'est un peu tard, mais je viens de rencontrer ce problème et peut-être que ma solution aidera quelqu'un d'autre qui a cela.
Je devais changer l'opacité, mais je ne pouvais pas le faire avec un NavLink, alors j'ai fait quelque chose comme ceci:
struct example: View {
@State var firstView = true
@State var appeared: Double = 0
var body: some View {
VStack{
if firstView{
VStack{
Button(action: {
self.firstView = false
}){
Text("change view")
}
}
}
else{
VStack{
Text("Hello, World!")
}
.opacity(appeared)
.animation(Animation.easeInOut(duration: 3.0), value: appeared)
.onAppear {self.appeared = 1.0}
.onDisappear {self.appeared = 0.0}
}
}
}
}
L'idée est que lorsque le bouton est enfoncé (ou chaque fois que les calculs que vous devez faire sont effectués), vous pouvez simuler une transition en utilisant une structure if-else {}.
J'espère que cela pourra aider!