Je voudrais créer une transition dont la suppression dépend d'une valeur @State lorsque la vue est supprimée.
Voici ce que j'ai essayé.
Si isValid est vrai lorsque la vue apparaît, il utilisera .move (edge: .trailing) pour la suppression, même si isValid devient faux entre-temps .
Ce que j'essaie d'obtenir est une transition .move (edge: .leading) si isValid est false lorsque le la vue est supprimée, même si elle était true lorsque la vue a été insérée.
Le problème apparaît lorsque je bascule show et isValid code> en même temps.
struct TextTransitionView: View {
@State var isValid = false
@State var show = false
var body: some View {
VStack {
Spacer()
if show {
Text("TEXT").transition(slideTransition)
}
Spacer()
Text("Move to \(isValid ? "right" : "left")")
Button("Toggle isValid") {
self.isValid.toggle()
}
Button("Toggle show") {
withAnimation { self.show.toggle() }
}
Button("Toggle isValid and show") {
withAnimation {
self.isValid.toggle()
self.show.toggle()
}
}
}
}
var slideTransition: AnyTransition {
let removal = isValid ? AnyTransition.move(edge: .trailing) : AnyTransition.move(edge: .leading)
return .asymmetric(insertion: .identity, removal: removal)
}
}
3 Réponses :
Voici une approche possible. Testé avec Xcode 11.4 / iOS 13.4
struct DemoTextTransition: View {
@State var isValid = false
@State var show = false
var body: some View {
VStack {
if show {
Text("TEXT").transition(slideTransition)
}
Button("Valid: \(isValid ? "True" : "False")") {
self.isValid.toggle()
}
Button("Test") {
withAnimation { self.show.toggle() }
}
}
}
var slideTransition: AnyTransition {
let removal = isValid ? AnyTransition.move(edge: .trailing) : AnyTransition.move(edge: .leading)
return .asymmetric(insertion: .identity, removal: removal)
}
}
Merci pour votre réponse. Quand je l'ai lu, j'ai pensé que c'était exactement ce que je faisais. En fait, cela m'a aidé à identifier le vrai problème. J'ai édité ma question pour ajouter un code complet avec le bogue et posté une réponse pour le résoudre.
voulez-vous dire comme ça?
struct ContentView: View {
@State var isValid = false
var slideTransition: AnyTransition {
let removal = isValid ? AnyTransition.move(edge: .trailing) : AnyTransition.move(edge: .leading)
return .asymmetric(insertion: .identity, removal: removal)
}
var body: some View {
VStack {
Button(action: {
withAnimation() {
self.isValid.toggle()
}
}) {
Text("animate it")
}
if isValid {
Text("text").transition(slideTransition)
}
}
}
}
Le problème était que isValid.toggle () se trouvait dans le withAnimation . La sortie de cette ligne du bloc withAnimation a résolu le problème.
Button("Toggle isValid and show") {
self.isValid.toggle()
withAnimation {
self.show.toggle()
}
}