Dlaczego narzędzie SwiftUI zmienia położenie formularza po nawigacji?

12

Po kliknięciu selektora przechodzi do wybranego widoku. Lista przedmiotów jest renderowana zbyt daleko od góry, ale przyciąga się po zakończeniu animacji. Dlaczego to się dzieje?

Demo: https://gfycat.com/idioticdizzyazurevase

Stworzyłem już minimalny przykład, aby wykluczyć tytuły i przyciski paska nawigacji, tworzyć sekcje i inne szczegóły:

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

Dzieje się tak w trybie podglądu, symulatorze i na urządzeniu (Xcode 11.2, iOS 13.2 w symulatorze, 13.3 beta 1 na urządzeniu).

Koraktor
źródło
Jest dość niedawno wideo na YouTube, wykazując podstawowe formy w SwiftUI, że działa tam, więc myślę, że nie jest to błąd w samej SwiftUI: youtu.be/Ho88Eid9gi0?t=573
Koraktor
Ten sam problem - bardzo denerwujący. Jeśli użyjesz stylu wbudowanego dla paska nawigacji, zniknie.
DogCoffee
3
... również tekst w komórkach przeskakuje - około 4 px w prawo
DogCoffee
2
@DogCoffee: Debugowałem poziomy skok, aby zmieniać wstawki. Można to naprawić, ustawiając je jawnie za pomocą .listRowInsets().
Koraktor,
bardzo doceniany, działa świetnie.
DogCoffee,

Odpowiedzi:

6

Oczywiście błędne zachowanie można obejść, wymuszając układanie stylu widoku nawigacji:

NavigationView {}.navigationViewStyle(StackNavigationViewStyle())

Jest to rozwiązanie mojego problemu, ale nie oznaczę tego jako zaakceptowanej odpowiedzi (jeszcze).

  1. Wydaje się, że jest to błąd, nawet jeśli może zostać wywołany przez szczególne okoliczności.
  2. Moje rozwiązanie nie będzie działać, jeśli potrzebujesz innego stylu widoku nawigacji.
  3. Dodatkowo nie naprawi poziomego repozycjonowania wspomnianego przez DogCoffee w komentarzach.
Koraktor
źródło
Jest to również przydatne, jeśli twoja aplikacja działa na iPadzie, w przeciwnym razie widoki modalne prezentowane są jako widok podziału główny-szczegółowy.
DogCoffee,
2

Moim zdaniem ma to coś wspólnego z paskiem nawigacji. Domyślnie (brak wzmianki o .navigationBarTitlerozszerzeniu) tryb wyświetlania nawigacji jest ustawiony na .automatic, należy to zmienić na .inline. Natknąłem się na inny post podobny do tego i używam ich rozwiązania do łączenia z twoim, używając .navigationBarTitle("", displayMode: .inline)powinno pomóc.

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
źródło
Działa to wokół problemu, ale zmienia również styl tytułu, który nie jest pożądany w moim przypadku.
Koraktor
2

Dopóki ten błąd nie zostanie rozwiązany, innym sposobem obejścia tego problemu przy zachowaniu DoubleColumnNavigationViewStyle dla iPadów byłoby warunkowe ustawienie tego stylu:

let navView = NavigationView {}
if UIDevice.current.userInterfaceIdiom == .pad {
    return AnyView(navView.navigationViewStyle(DoubleColumnNavigationViewStyle()))
} else {
    return AnyView(navView.navigationViewStyle(StackNavigationViewStyle()))
}
Brandon C.
źródło
0

Dzięki za ten wątek wszystkim! Naprawdę pomógł mi lepiej zrozumieć rzeczy i opanować jeden z moich problemów. Aby podzielić się z innymi, miałem ten problem, ale miałem również ten problem, gdy ustawiłem sekcję, aby pojawiała się w instrukcji if / else ustawionej w sekcji z przełącznikiem. Po włączeniu przełącznika przesuwa nagłówek sekcji w poziomie o kilka pikseli.

Oto jak to naprawiłem

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

Nadal mam przesunięcie w poziomie w widoku wyboru selektora i nie jestem pewien, jak to naprawić. Utworzyłem kolejny wątek do otrzymanych danych wejściowych. Dzięki jeszcze raz! Tekst SwiftUI Shift Picker w poziomie

Sean
źródło