SwiftUI neden navigasyondan sonra form yeniden konumlandırmada seçicidir?


12

Seçiciyi tıkladıktan sonra seçme görünümüne gider. Öğe listesi üstten çok uzakta oluşturulur, ancak animasyon bittikten sonra yukarı çıkar. Bu neden oluyor?

Demo: https://gfycat.com/idioticdizzyazurevase

Gezinme çubuğu başlıklarını ve düğmelerini, form bölümlerini ve diğer ayrıntıları dışlamak için zaten minimal bir örnek oluşturdum:

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

Bu önizleme modunda, simülatörde ve cihazda gerçekleşir (Xcode 11.2, simülatörde iOS 13.2, cihazda 13.3 beta 1).


YouTube'da SwiftUI'de temel formları gösteren oldukça yeni bir video var, orada çalışıyor, bu yüzden sanırım SwiftUI'nin kendisinde bir hata değil: youtu.be/Ho88Eid9gi0?t=573
Koraktor

Aynı konu - çok sinir bozucu. Nav bar için satır içi stil kullanırsanız, gider.
DogCoffee

3
... ayrıca hücrelerdeki metin atlar - yaklaşık 4 piksel sağa
DogCoffee

2
@DogCoffee: İç kısımları değiştirmek için yatay atlamada hata ayıkladım. Bu, açıkça ayarlanarak düzeltilebilir .listRowInsets().
Koraktor

çok takdir, harika çalışıyor.
DogCoffee

Yanıtlar:


6

Açıkçası buggy davranışı, gezinme görünümü stilini yığılmaya zorlarken çözülebilir:

NavigationView {}.navigationViewStyle(StackNavigationViewStyle())

Bu benim sorunuma bir çözüm, ama bunu kabul edilmiş cevap olarak işaretlemeyeceğim (henüz).

  1. Özel durumlar tarafından tetiklense bile bir hata gibi görünüyor.
  2. Başka bir navigasyon görünüm stiline ihtiyacınız varsa çözümüm çalışmaz.
  3. Ayrıca, yorumlarda DogCoffee tarafından belirtilen yatay yeniden konumlandırmayı düzeltmeyecektir.

Bu, uygulamanız iPad'lerde çalışıyorsa da yararlıdır, aksi takdirde modsal görünümleriniz ana ayrıntı bölünmüş görünümü olarak sunulur.
DogCoffee

2

Bence, gezinme çubuğuyla ilgili bir şey var. Varsayılan olarak ( .navigationBarTitleuzantıdan bahsedilmiyor ), navigasyon ekran modu olarak ayarlanmıştır .automatic, bu ayarın değiştirilmesi gerekir .inline. Buna benzer başka bir gönderiyle karşılaştım ve çözümlerini sizinkilerle birleştirmek için kullanıyorum, kullanarak .navigationBarTitle("", displayMode: .inline)yardımcı olmalı.

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

Bu sorun etrafında çalışır, ancak benim durumumda istenmeyen başlık stilini de değiştirir.
Koraktor

2

Bu hata giderilene kadar, iPad'ler için DoubleColumnNavigationViewStyle'ı korurken bu soruna geçici bir çözüm bulmak için başka bir yol şartlı olarak bu stili ayarlamak olacaktır:

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

0

Bu konu için herkese teşekkürler! Gerçekten işleri daha iyi anlamama ve sorunlarımdan birini ele geçirmeme yardımcı oldu. Başkalarıyla paylaşmak için ben bu sorunu yaşıyordu ama aynı zamanda bir bölümü bir geçiş ile ayarlanmış bir if / else deyiminde görünmesi için bir bölüm ayarladığınızda da bu sorunu yaşıyordu. Geçiş etkinleştirildiğinde bölüm başlığını yatay olarak birkaç piksel kaydırır.

İşte nasıl düzelttim

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

Seçici seçim görünümümde hala yatay kaydırma var ve nasıl düzeltileceğimden emin değilim. Girdi almak için başka bir iş parçacığı oluşturdum. Tekrar teşekkürler! SwiftUI Shift Seçici Metin Yatay

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.