Probleme de presenation de vues avec NavigationView

Bonjour je suis en train de regarder les animations avec SwiftUI, j’ai créé plusieurs vues animation pour apprendre modestement. j’ai regroupé toutes mes vues d’animations. Et je souhaite présenter mes animations dans une liste avec une navigationView.

Pour chaque vue l’animation déclenche via un bouton. Quand j’exécute la vue animation seul tout se passe bien. Mais quand présente la vue animation via une navigationView à la présentation de la vue animation le bouton tombe du haut vers le bas de la vue et l’animation se déclenchent toute seule.

J’ai fait un petit test de présentation de la vue animation avec un bouton + appel de la via .sheet tout se passe bien. Le problème vient du navigationView lors de la présentation de la vue.

Ci-joint le code pour mieux comprendre. (une seule vue animation pour l’exemple) avec les deux versions de présentation.

import SwiftUI

struct ContentView: View {
@State var montrerVue = false

var body: some View {
    VStack {
        NavigationView {
            List {
                NavigationLink("Bouton Agrandir", destination: Animation2())
                NavigationLink("Rebondir", destination: Animation2())
                NavigationLink("Durée", destination: Animation2())
                NavigationLink("Durée + temporisation", destination: Animation2())
                NavigationLink("Répeter l'animation" , destination: Animation2())
                NavigationLink("Rayonnement" , destination: Animation2())
            }
            .navigationTitle("Animations")
        }
        
        // presentation de vue avec un bouton
        Button(action: {
            self.montrerVue.toggle()
        }, label: {
            Text("Montrer vue")
        })
        .sheet(isPresented: $montrerVue) {
            Animation2()
        }
    }
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
    ContentView()
}
}


vue animation 

import SwiftUI

struct Animation2: View {
@State var tpsAnimation:CGFloat = 1

var body: some View {
    Button(action: {
        self.tpsAnimation += 2
        
    }, label: {
        Text("Tape moi")
    })
    .padding(50)
    .foregroundColor(.black)
    .background(Color.red)
    .clipShape(Circle())
    // grossir le bouton
    .scaleEffect(tpsAnimation)
    // stiffness = rigidité & damping = amortissement 
    .animation((.interpolatingSpring(stiffness: 30, damping: 0)))
}
}

struct Animation2_Previews: PreviewProvider {
static var previews: some View {
    Animation2()
}
}

Je ne comprends pas pourquoi la vue réagit comme cela.
Ci joint l’exemple complet sur GitHub avec toutes les vues animations.
Exemple complet avec toutes les vues.

Je ne vais pas spécialement t’aider car je n’ai pas les compétences pour répondre à ta question mais je me demande si le problème de vient pas de la NavigationView ?

J’ai contournée le problème en utilisant à la place une tabView et là plus aucun soucis de décalage

Citation J’ai fait un petit test de présentation de la vue animation avec un bouton + appel de la via .sheet tout se passe bien. Le problème vient du navigationView lors de la présentation de la vue.

On arrive au même résultat, comme tu le vois dans mon code. Moi j’avais fait l’essai avec une présentation vue sheet et je n’ai pas le problème non plus. Dans la précipitation des tests pour comprendre j’ai pas pensé au TabView.

Je ne comprends pas non plus Merci à toi.

// presentation de vue avec un bouton
Button(action: {
self.montrerVue.toggle()
}, label: {
Text(« Montrer vue »)
})
.sheet(isPresented: $montrerVue) {
Animation2()
}

Oui en effet j’avais mal lu le titre et je n’avais pas vu que tu avais bien précisé que la NavigationView ne marchais pas …

J’ai fait quelque test et ce que je remarque c’est que en mettant l’animation directement dans la NavigationView et non dans le composant tu n’as plus l’effet de chute non désiré (je ne sais pas si tu avais déjà essayé) par contre l’animation elle ne marche plus comme souhaitée dans mes tests (après je ne suis pas encore à l’aise avec les animations et je ne suis pas sur sur d’avoir bien compris le code)

Bonsoir,

J’ai fait quelque test et ce que je remarque c’est que en mettant l’animation directement dans la NavigationView et non dans le composant tu n’as plus l’effet de chute non désiré (je ne sais pas si tu avais déjà essayé) par contre l’animation elle ne marche plus comme souhaitée dans mes tests (après je ne suis pas encore à l’aise avec les animations et je ne suis pas sur sur d’avoir bien compris le code)

Effectivement ta solution ne résout pas complètement le problème.

Je me suis posé une question cet après-midi, n’y a-t-il pas une histoire de frame(x:0,y:0) ? Par rapport à l’animation, mais dans ce cas pourquoi uniquement avec la navigationView ?

Monsieur le « professeur @mbritto » à surement une idée sur la question ? je n’ai poursuivi mes recherches, je le ferais demain.

Pour info j’ai publié aujourd’hui un chapitre sur les animations avec SwiftUI, peut être que ça pourra t’aider pour ton soucis.
Je n’ai pas testé de faire des animations avec un NavigationView mais sait-on jamais.
Par contre j’ai constaté plusieurs bugs d’animation dans l’aperçu de SwiftUI. As-tu testé dans un simulateur ou un véritable iPhone ?

1 J'aime

Bonjour Maxime,
je viens de faire plusieurs tests:

  • Version Xcode 12.1
    le problème semble venir du comportement des simulateurs (Bug) avec mon iPhone l’animation semble mieux se comporter. Le bouton ne tombe plus à la présentation de la vue.

  • version beta 12.3 le problème semble corrigé avec le simulateur l’animation se comporte normalement, comme un Device.

ouf

Merci à toi j’ai vu.

Salut @titastus,

Je vois que tu as intégré la navigationView dans un VSack. Essaye de mettre la nvigationView en premier (a tout hasard) :

NavigationView > VSTack > [ List / Button ]

Ces bug inexplicable dans SwiftUI m’insupporte, c’est pourquoi j’ai décidé de l’abandonner pour le moment.