Warum wird der SwiftUI-Picker nach der Navigation neu positioniert?


12

Nach dem Klicken auf die Auswahl navigiert es zur Auswahlansicht. Die Elementliste wird zu weit von oben gerendert, wird jedoch nach Abschluss der Animation angezeigt. Warum passiert dies?

Demo: https://gfycat.com/idioticdizzyazurevase

Ich habe bereits ein minimales Beispiel erstellt, um Titel und Schaltflächen der Navigationsleiste, Formularabschnitte und andere Details auszuschließen:

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

Dies geschieht im Vorschaumodus, im Simulator und auf dem Gerät (Xcode 11.2, iOS 13.2 im Simulator, 13.3 Beta 1 auf dem Gerät).


Es ist ein relativ neues Video auf YouTube zeigt Grundformen in SwiftUI, es ist dort zu arbeiten, so dass ich denke , es ist kein Fehler in SwiftUI selbst: youtu.be/Ho88Eid9gi0?t=573
Koraktor

Gleiches Problem - sehr nervig. Wenn Sie den Inline-Stil für die Navigationsleiste verwenden, verschwindet dieser.
DogCoffee

3
... auch der Text in den Zellen springt - ca. 4 px nach rechts
DogCoffee

2
@ DogCoffee: Ich habe das horizontale Springen getestet, um die Einsätze zu ändern. Dies kann durch explizites Setzen mit behoben werden .listRowInsets().
Koraktor

sehr geschätzt, funktioniert super.
DogCoffee

Antworten:


6

Das offensichtlich fehlerhafte Verhalten kann umgangen werden, wenn der Navigationsansichtsstil gestapelt wird:

NavigationView {
}.navigationViewStyle(StackNavigationViewStyle())

Dies ist eine Lösung für mein Problem, aber ich werde dies (noch) nicht als akzeptierte Antwort markieren.

  1. Es scheint ein Fehler zu sein, auch wenn er durch besondere Umstände ausgelöst werden kann.
  2. Meine Lösung funktioniert nicht, wenn Sie einen anderen Navigationsansichtsstil benötigen.
  3. Außerdem wird die von DogCoffee in den Kommentaren erwähnte horizontale Neupositionierung nicht behoben.

Dies ist auch nützlich, wenn Ihre App auf iPads ausgeführt wird. Andernfalls werden Ihre modalen Ansichten als geteilte Master-Detail-Ansicht angezeigt.
DogCoffee

2

Meiner Meinung nach hat das etwas mit der Navigationsleiste zu tun. Standardmäßig (keine Erwähnung der .navigationBarTitleErweiterung) ist der Navigationsanzeigemodus auf eingestellt .automatic, dies sollte geändert werden .inline. Ich bin auf einen ähnlichen Beitrag gestoßen und verwende deren Lösung, um sie mit Ihrer zu kombinieren .navigationBarTitle("", displayMode: .inline).

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

Dies umgeht das Problem, ändert aber auch den Titelstil, der in meinem Fall nicht erwünscht ist.
Koraktor

2

Bis dieser Fehler behoben ist, besteht eine andere Möglichkeit, dieses Problem zu umgehen und gleichzeitig den DoubleColumnNavigationViewStyle für iPads beizubehalten, darin, diesen Stil unter bestimmten Bedingungen festzulegen:

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

0

Danke für diesen Thread an alle! Hat mir wirklich geholfen, die Dinge besser zu verstehen und eines meiner Probleme in den Griff zu bekommen. Zum Teilen mit anderen hatte ich dieses Problem, aber ich hatte auch dieses Problem, als ich einen Abschnitt so festlegte, dass er in einer if / else-Anweisung angezeigt wird, die für einen Abschnitt mit einem Umschalter festgelegt wurde. Wenn der Umschalter aktiviert war, wurde der Abschnittskopf horizontal um einige Pixel verschoben.

Folgendes habe ich behoben

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

Ich habe immer noch eine horizontale Verschiebung in meiner Auswahlauswahl und bin mir nicht sicher, wie ich das beheben soll. Ich habe einen weiteren Thread erstellt, um Eingaben zu erhalten. Danke noch einmal! SwiftUI Shift Picker Text horizontal

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.