Perché il selettore SwiftUI si riposiziona in forma dopo la navigazione?


12

Dopo aver fatto clic sul selettore, passa alla vista di selezione. L'elenco degli elementi è reso troppo lontano dall'alto, ma si blocca dopo che l'animazione è terminata. Perché sta succedendo?

Demo: https://gfycat.com/idioticdizzyazurevase

Ho già creato un esempio minimo per escludere titoli e pulsanti della barra di navigazione, sezioni dei moduli e altri dettagli:

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()
    }
}

Ciò accade in modalità anteprima, simulatore e sul dispositivo (Xcode 11.2, iOS 13.2 nel simulatore, 13.3 beta 1 sul dispositivo).


C'è un video abbastanza recente su YouTube che mostra i moduli di base in SwiftUI, funziona lì, quindi immagino che non sia un bug in SwiftUI stesso: youtu.be/Ho88Eid9gi0?t=573
Koraktor

Stesso problema - molto fastidioso. Se si utilizza lo stile in linea per la barra di navigazione, scompare.
DogCoffee

3
... anche il testo nelle celle salta - circa 4 px a destra
DogCoffee

2
@ DogCoffee: ho eseguito il debug del salto orizzontale per cambiare le inserzioni. Questo può essere risolto impostandoli esplicitamente con .listRowInsets().
Koraktor,

molto apprezzato, funziona benissimo.
DogCoffee

Risposte:


6

Il comportamento ovviamente buggy può essere aggirato quando si impone lo stile di visualizzazione di navigazione in pila:

NavigationView {}.navigationViewStyle(StackNavigationViewStyle())

Questa è una soluzione al mio problema, ma non lo segnerò come risposta accettata (ancora).

  1. Sembra essere un bug, anche se può essere innescato da circostanze speciali.
  2. La mia soluzione non funzionerà se hai bisogno di un altro stile di visualizzazione della navigazione.
  3. Inoltre, non risolverà il riposizionamento orizzontale menzionato da DogCoffee nei commenti.

Questo è utile anche se la tua app viene eseguita su iPad, altrimenti le tue viste modali si presentano come una vista suddivisa in dettaglio principale.
DogCoffee

2

Secondo me, ha qualcosa a che fare con la barra di navigazione. Per impostazione predefinita (nessuna menzione .navigationBarTitledell'estensione), la modalità di visualizzazione della navigazione è impostata su .automatic, questa deve essere modificata .inline. Mi sono imbattuto in un altro post simile a questo e utilizzo la loro soluzione per combinare con il tuo, usando .navigationBarTitle("", displayMode: .inline)dovrebbe aiutare.

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()
    }
}

Questo risolve il problema, ma cambia anche lo stile del titolo che non è desiderato nel mio caso.
Koraktor,

2

Fino a quando questo bug non viene risolto, un altro modo per aggirare questo problema mantenendo DoubleColumnNavigationViewStyle per iPad sarebbe quello di impostare condizionalmente quello stile:

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

0

Grazie per questa discussione a tutti! Mi ha davvero aiutato a capire di più le cose e a capire uno dei miei problemi. Per condividere con gli altri, ho riscontrato questo problema, ma ho riscontrato questo problema anche quando ho impostato una sezione in modo che appaia in un'istruzione if / else impostata su una sezione con un interruttore. Quando la levetta era attivata, spostava l'intestazione della sezione in orizzontale di alcuni pixel.

Quanto segue è come l'ho risolto

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

Ho ancora uno spostamento orizzontale nella vista di selezione del selettore e non sono sicuro di come risolvere. Ho creato un altro thread per l'input ricevuto. Grazie ancora! SwiftUI Maiusc Selettore testo orizzontale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.