Mengapa pemilih SwiftUI dalam reposisi bentuk setelah navigasi?

12

Setelah mengklik pemilih itu menavigasi ke tampilan pilih. Daftar item dirender terlalu jauh dari atas, tetapi terkunci setelah animasi selesai. Mengapa ini terjadi?

Demo: https://gfycat.com/idioticdizzyazurevase

Saya sudah membuat contoh minimal untuk menyingkirkan judul dan tombol bilah navigasi, bagian formulir, dan detail lainnya:

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

Ini terjadi dalam mode pratinjau, simulator dan pada perangkat (Xcode 11.2, iOS 13.2 di simulator, 13.3 beta 1 pada perangkat).

Koraktor
sumber
Ada video yang cukup baru di YouTube yang menunjukkan bentuk dasar di SwiftUI, itu berfungsi di sana, jadi saya kira itu bukan bug di SwiftUI sendiri: youtu.be/Ho88Eid9gi0?t=573
Koraktor
Masalah yang sama - sangat menjengkelkan. Jika Anda menggunakan gaya inline untuk bilah nav itu hilang.
DogCoffee
3
... juga teks dalam sel melompat - sekitar 4 px ke kanan
DogCoffee
2
@DogCoffee: Saya debugged lompatan horizontal untuk mengubah insets. Ini dapat diperbaiki dengan mengaturnya secara eksplisit .listRowInsets().
Koraktor
sangat dihargai, bekerja dengan baik.
DogCoffee

Jawaban:

6

Perilaku buggy yang jelas dapat diselesaikan ketika memaksa gaya tampilan navigasi ditumpuk:

NavigationView {
}.navigationViewStyle(StackNavigationViewStyle())

Ini adalah solusi untuk masalah saya, tetapi saya tidak akan menandai ini sebagai jawaban yang diterima (belum).

  1. Tampaknya menjadi bug, bahkan jika itu dipicu oleh keadaan khusus.
  2. Solusi saya tidak akan berfungsi jika Anda memerlukan gaya tampilan navigasi lain.
  3. Selain itu, itu tidak akan memperbaiki reposisi horisontal yang disebutkan oleh DogCoffee di komentar.
Koraktor
sumber
Ini juga berguna jika aplikasi Anda berjalan pada iPad, jika tidak, tampilan modal Anda ditampilkan sebagai tampilan pemisahan detail utama.
DogCoffee
2

Menurut pendapat saya, ini ada hubungannya dengan bilah navigasi. Secara default (tanpa menyebutkan .navigationBarTitleekstensi), mode tampilan navigasi diatur ke .automatic, ini harus diubah .inline. Saya menemukan posting lain yang mirip dengan ini dan menggunakan solusi mereka untuk bergabung dengan Anda, dengan menggunakan .navigationBarTitle("", displayMode: .inline)harus membantu.

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
sumber
Ini mengatasi masalah ini, tetapi juga mengubah gaya judul yang tidak diinginkan dalam kasus saya.
Koraktor
2

Sampai bug ini diselesaikan dengan cara lain untuk mengatasi masalah ini sambil tetap mempertahankan DoubleColumnNavigationViewStyle untuk iPads adalah dengan mengatur secara kondisional gaya tersebut:

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

Terima kasih untuk utas ini, semuanya! Benar-benar membantu saya memahami lebih banyak hal dan memahami salah satu masalah saya. Untuk berbagi dengan orang lain, saya mengalami masalah ini tetapi saya juga mengalami masalah ini ketika saya mengatur bagian untuk muncul di pernyataan if / else yang ditetapkan pada bagian dengan toggle. Ketika sakelar diaktifkan, ia akan menggeser tajuk bagian secara horizontal beberapa piksel.

Berikut ini adalah cara saya memperbaikinya

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

Saya masih mengalami pergeseran horizontal pada tampilan pemilihan pemilih saya dan tidak yakin bagaimana cara memperbaikinya. Saya membuat utas lain untuk menerima input. Terima kasih lagi! SwiftUI Shift Picker Text Horizontal

Sean
sumber