web-dev-qa-db-fra.com

Pourquoi le sélecteur SwiftUI est-il en train de se repositionner après la navigation?

Après avoir cliqué sur le sélecteur, il accède à la vue de sélection. La liste des éléments est rendue trop loin du haut, mais s'accroche une fois l'animation terminée. Pourquoi cela arrive-t-il?

Démo: https://gfycat.com/idioticdizzyazurevase

J'ai déjà créé un exemple minimal pour exclure les titres et boutons de la barre de navigation, les sections de formulaire et d'autres détails:

import SwiftUI

struct NewProjectView: View {

    @State var name = ""

    var body: some View {
        NavigationView {
            Form {
                Picker("Client", selection: $name) {
                    Text("Client 1")
                    Text("Client 2")
                }
            }
        }
    }
}

struct NewProjectView_Previews: PreviewProvider {
    static var previews: some View {
        NewProjectView()
    }
}

Cela se produit en mode aperçu, sur simulateur et sur l'appareil (Xcode 11.2, iOS 13.2 dans le simulateur, 13.3 beta 1 sur l'appareil).

11
Koraktor

Le comportement évidemment bogué peut être contourné lors du forçage du style de vue de navigation à empiler:

NavigationView {
    …
}.navigationViewStyle(StackNavigationViewStyle())

Ceci est une solution à mon problème, mais je ne la marquerai pas (comme encore) comme une réponse acceptée.

  1. Cela semble être un bug, même s'il peut être déclenché par des circonstances particulières.
  2. Ma solution ne fonctionnera pas si vous avez besoin d'un autre style d'affichage de navigation.
  3. De plus, il ne corrigera pas le repositionnement horizontal mentionné par DogCoffee dans les commentaires.
3
Koraktor

Jusqu'à ce que ce bogue soit résolu, une autre façon de contourner ce problème tout en conservant DoubleColumnNavigationViewStyle pour iPad serait de définir ce style de manière conditionnelle:

let navView = NavigationView {
    …
}
if UIDevice.current.userInterfaceIdiom == .pad {
    return AnyView(navView.navigationViewStyle(DoubleColumnNavigationViewStyle()))
} else {
    return AnyView(navView.navigationViewStyle(StackNavigationViewStyle()))
}
2
Brandon C.

À mon avis, cela a quelque chose à voir avec la barre de navigation. Par défaut (aucune mention de l'extension .navigationBarTitle), Le mode d'affichage de la navigation est réglé sur .automatic, Ceci doit être modifié en .inline. Je suis tombé sur un autre article similaire à celui-ci et j'utilise leur solution pour la combiner avec la vôtre, en utilisant .navigationBarTitle("", displayMode: .inline) devrait aider.

import SwiftUI

struct NewProjectView: View {

    @State var name = ""

    var body: some View {
        NavigationView {
            Form {
                Picker("Client", selection: $name) {
                    Text("Client 1")
                    Text("Client 2")
                }
            }
            .navigationBarTitle("", displayMode: .inline)
        }
    }
}


struct NewProjectView_Previews: PreviewProvider {
    static var previews: some View {
        NewProjectView()
    }
}
2
np2314