J'essaye d'animer le changement de valeur dans un texte en utilisant withAnimation
mais cela ne semble pas fonctionner. J'ai rencontré une question similaire mais la réponse n'anime pas la valeur du texte.
J'essaye de recréer ce comportement dans SwiftUI pur ( IKit Example ):
J'ai essayé ce code mais il n'anime pas le changement de texte:
struct TextAnimationView: View {
@State private var textValue = "0"
var body: some View {
VStack (spacing: 50) {
Text(textValue)
.font(.largeTitle)
.frame(width: 200, height: 200)
.transition(.opacity)
Button("Next") {
withAnimation (.easeInOut(duration: 1)) {
self.textValue = "\(Int.random(in: 1...100))"
}
}
}
}
}
J'ai très peu d'expérience avec SwiftUI, y a-t-il un autre moyen d'y parvenir?
Merci d'avance :)
Voici l'approche utilisant la transition standard. Les tailles de police, les images, les durées d'animation sont configurables selon vos besoins. La démo ne comprend que des éléments importants pour l'approche.
struct TestFadeNumbers: View {
@State private var textValue: Int = 0
var body: some View {
VStack (spacing: 50) {
if textValue % 2 == 0 {
Text("\(textValue)")
.font(.system(size: 200))
.transition(.opacity)
}
if textValue % 2 == 1 {
Text("\(textValue)")
.font(.system(size: 200))
.transition(.opacity)
}
Button("Next") {
withAnimation(.linear(duration: 0.25), {
self.textValue += 1
})
}
Button("Reset") {
withAnimation(.easeInOut(duration: 0.25), {
self.textValue = 0
})
}
}
}
}
Je n'ai pas trouvé de moyen d'animer la valeur du texte avec un fondu. Lors de la définition de la propriété d'animation d'un Text
, vous verrez trois points (...) lors de l'animation.
Pour l'instant, j'ai trouvé un travail autour duquel changera l'opacité:
@State private var textValue: Int = 1
@State private var opacity: Double = 1
var body: some View {
VStack (spacing: 50) {
Text("\(textValue)")
.font(.largeTitle)
.frame(width: 200, height: 200)
.opacity(opacity)
Button("Next") {
withAnimation(.easeInOut(duration: 0.5), {
self.opacity = 0
})
self.textValue += 1
withAnimation(.easeInOut(duration: 1), {
self.opacity = 1
})
}
}
}
Cela disparaîtra et disparaîtra dans le texte lorsque vous le modifierez.
Donc, il s'avère que c'est vraiment facile
Text(textValue)
.font(.largeTitle)
.frame(width: 200, height: 200)
.transition(.opacity)
.id("MyTitleComponent" + textValue)
Notez le id
supplémentaire à la fin. SwiftUI l'utilise pour décider s'il s'agit de la même vue ou non lors d'un rafraîchissement. Si l'ID est différent, cela suppose que la vue précédente a été supprimée et que celle-ci a été ajoutée. Comme il ajoute une nouvelle vue, il applique la transition spécifiée comme prévu.
NB: Il est tout à fait possible que cet identifiant soit unique pour toute l'arborescence de la vue donc vous voudrez probablement prendre soin de l'espace de noms en conséquence (d'où le préfixe MyTitleComponent
dans l'exemple).