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

12

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).

Koraktor
la source
Il y a une vidéo assez récente sur YouTube montrant les formes de base dans SwiftUI, cela fonctionne là-bas, donc je suppose que ce n'est pas un bug dans SwiftUI lui-même: youtu.be/Ho88Eid9gi0?t=573
Koraktor
Même problème - très ennuyeux. Si vous utilisez le style en ligne pour la barre de navigation, cela disparaît.
DogCoffee
3
... aussi le texte dans les cellules saute - environ 4 px vers la droite
DogCoffee
2
@DogCoffee: J'ai débogué le saut horizontal pour changer d'encarts. Cela peut être résolu en les définissant explicitement avec .listRowInsets().
Koraktor
très apprécié, fonctionne très bien.
DogCoffee

Réponses:

6

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

NavigationView {}.navigationViewStyle(StackNavigationViewStyle())

C'est une solution à mon problème, mais je ne marquerai pas cela comme une réponse acceptée (pour le moment).

  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, cela ne corrigera pas le repositionnement horizontal mentionné par DogCoffee dans les commentaires.
Koraktor
la source
Cela est également utile si votre application fonctionne sur iPad, sinon vos vues modales se présentent comme une vue principale divisée en détails.
DogCoffee
2

À mon avis, cela a quelque chose à voir avec la barre de navigation. Par défaut (pas de mention d' .navigationBarTitleextension), le mode d'affichage de navigation est réglé sur .automatic, il doit être modifié en .inline. Je suis tombé sur un autre post 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()
    }
}
np2314
la source
Cela contourne le problème, mais cela modifie également le style de titre, ce qui n'est pas souhaité dans mon cas.
Koraktor
2

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()))
}
Brandon C.
la source
0

Merci pour ce fil tout le monde! M'a vraiment aidé à mieux comprendre les choses et à saisir l'un de mes problèmes. Pour partager avec les autres, je rencontrais ce problème mais je rencontrais également ce problème lorsque je définissais une section pour apparaître dans une instruction if / else définie sur une section avec une bascule. Lorsque la bascule était activée, elle déplacerait l'en-tête de section horizontalement de quelques pixels.

Voici comment je l'ai corrigé

Section(header: Text("Subject Identified").listRowInsets(EdgeInsets()).padding(.leading)) {
                Picker(selection: $subIndex, label: Text("Test")) {
                    ForEach(0 ..< subIdentified.count) {
                        Text(self.subIdentified[$0]).tag($0)
                    }
                }
            .labelsHidden()
            .pickerStyle(SegmentedPickerStyle())

J'ai toujours un décalage horizontal sur ma vue de sélection de sélecteur et je ne sais pas comment résoudre ce problème. J'ai créé un autre fil pour recevoir une entrée. Merci encore! SwiftUI Shift Picker Text Horizontal

Sean
la source