¿Por qué el selector SwiftUI en reposicionamiento de formularios después de la navegación?

12

Después de hacer clic en el selector, navega a la vista de selección. La lista de elementos se representa demasiado lejos de la parte superior, pero se ajusta una vez que finaliza la animación. ¿Por qué está pasando esto?

Demostración: https://gfycat.com/idioticdizzyazurevase

Ya creé un ejemplo mínimo para descartar títulos y botones de la barra de navegación, secciones de formulario y otros detalles:

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

Esto sucede en modo de vista previa, simulador y en dispositivo (Xcode 11.2, iOS 13.2 en simulador, 13.3 beta 1 en dispositivo).

Koraktor
fuente
Hay un video bastante reciente en YouTube que muestra formas básicas en SwiftUI, está funcionando allí, así que supongo que no es un error en SwiftUI: youtu.be/Ho88Eid9gi0?t=573
Koraktor
El mismo problema, muy molesto. Si usa el estilo en línea para la barra de navegación, desaparece.
DogCoffee
3
... también salta el texto en las celdas - aproximadamente 4 px a la derecha
DogCoffee
2
@DogCoffee: depuré el salto horizontal para cambiar las inserciones. Esto se puede solucionar configurándolos explícitamente con .listRowInsets().
Koraktor
Muy apreciado, funciona muy bien.
DogCoffee

Respuestas:

6

El comportamiento obviamente defectuoso se puede solucionar cuando se fuerza el estilo de la vista de navegación para apilarse:

NavigationView {}.navigationViewStyle(StackNavigationViewStyle())

Esta es una solución a mi problema, pero no marcaré esto como respuesta aceptada (todavía).

  1. Parece ser un error, incluso si puede ser provocado por circunstancias especiales.
  2. Mi solución no funcionará si necesita otro estilo de vista de navegación.
  3. Además, no solucionará el reposicionamiento horizontal mencionado por DogCoffee en los comentarios.
Koraktor
fuente
Esto también es útil si su aplicación se ejecuta en iPads, de lo contrario, sus vistas modales se presentan como una vista dividida de detalle maestro.
DogCoffee
2

En mi opinión, tiene algo que ver con la barra de navegación. Por defecto (sin mencionar la .navigationBarTitleextensión), el modo de visualización de navegación está configurado en .automatic, esto debería modificarse a .inline. Encontré otra publicación similar a esta y uso su solución para combinarla con la tuya, usando .navigationBarTitle("", displayMode: .inline)debería ayudar.

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
fuente
Esto soluciona el problema, pero también cambia el estilo del título que no se desea en mi caso.
Koraktor
2

Hasta que este error se resuelva, otra forma de solucionar este problema mientras se mantiene DoubleColumnNavigationViewStyle para iPads sería establecer condicionalmente ese estilo:

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

Gracias por este hilo a todos! Realmente me ayudó a entender más las cosas y a resolver uno de mis problemas. Para compartir con otros, tenía este problema pero también tuve este problema cuando configuré una sección para que apareciera en una instrucción if / else establecida en una sección con una palanca. Cuando se activaba la palanca, desplazaría el encabezado de la sección horizontalmente unos pocos píxeles.

Lo siguiente es cómo lo arreglé

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

Todavía tengo desplazamiento horizontal en mi vista de selección de selector y no estoy seguro de cómo solucionarlo. Creé otro hilo para recibir entrada. ¡Gracias de nuevo! SwiftUI Shift Picker Text Horizontal

Sean
fuente