Por que o selecionador SwiftUI está no reposicionamento de formulários após a navegação?

12

Depois de clicar no seletor, ele navega para a visualização selecionada. A lista de itens é renderizada muito longe do topo, mas se fecha depois que a animação é concluída. Por que isso está acontecendo?

Demonstração: https://gfycat.com/idioticdizzyazurevase

Eu já criei um exemplo mínimo para descartar títulos e botões da barra de navegação, seções de formulário e outros detalhes:

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

Isso acontece no modo de visualização, simulador e no dispositivo (Xcode 11.2, iOS 13.2 no simulador, 13.3 beta 1 no dispositivo).

Koraktor
fonte
Há um vídeo bastante recente no YouTube demonstrando formas básicas em SwiftUI, ele está trabalhando lá, então eu acho que não é um erro em si SwiftUI: youtu.be/Ho88Eid9gi0?t=573
Koraktor
Mesmo problema - muito chato. Se você usar o estilo embutido para a barra de navegação, ela desaparecerá.
DogCoffee 14/11/19
3
... também o texto nas células salta - cerca de 4 px à direita
DogCoffee
2
@ DogCoffee: depurei o salto horizontal para mudar as inserções. Isso pode ser corrigido configurando-os explicitamente com .listRowInsets().
Koraktor 01/12/19
muito apreciado, funciona muito bem.
DogCoffee 01/12/19

Respostas:

6

O comportamento obviamente com erros pode ser contornado ao forçar o estilo de exibição de navegação para empilhar:

NavigationView {}.navigationViewStyle(StackNavigationViewStyle())

Esta é uma solução para o meu problema, mas não vou marcar isso como resposta aceita (ainda).

  1. Parece ser um bug, mesmo que possa ser acionado por circunstâncias especiais.
  2. Minha solução não funcionará se você precisar de outro estilo de exibição de navegação.
  3. Além disso, ele não corrigirá o reposicionamento horizontal mencionado pelo DogCoffee nos comentários.
Koraktor
fonte
Isso também é útil se o aplicativo for executado em iPads; caso contrário, suas visualizações modais serão exibidas como uma exibição dividida de detalhes principais.
DogCoffee 01/12/19
2

Na minha opinião, tem algo a ver com a barra de navegação. Por padrão (sem menção de .navigationBarTitleextensão), o modo de exibição de navegação está definido como .automatic, deve ser alterado para .inline. Me deparei com outro post semelhante a este e use sua solução para combinar com a sua, usando .navigationBarTitle("", displayMode: .inline)deve ajudar.

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
fonte
Isso resolve o problema, mas também altera o estilo do título, que não é desejado no meu caso.
Koraktor 4/01
2

Até que esse bug seja resolvido, outra maneira de solucionar esse problema, mantendo o DoubleColumnNavigationViewStyle para iPads, seria definir condicionalmente esse estilo:

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

Obrigado por esta discussão todos! Realmente me ajudou a entender as coisas mais e a se apossar de um dos meus problemas. Para compartilhar com outras pessoas, eu estava tendo esse problema, mas também estava com esse problema quando defini uma seção para aparecer em uma instrução if / else definida em uma seção com uma alternância. Quando a alternância era ativada, o cabeçalho da seção mudava horizontalmente alguns pixels.

A seguir, é como eu o consertei

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

Ainda estou tendo o deslocamento horizontal na visualização da seleção do selecionador e não sei como consertar. Eu criei outro thread para a entrada recebida. Obrigado novamente! Texto do SwiftUI Shift Picker Horizontal

Sean
fonte