Чому інструмент вибору SwiftUI переміщує форму після навігації?


12

Після натискання кнопки вибору переходить до вибору вибору. Список елементів відображається занадто далеко від верху, але оснащується після завершення анімації. Чому це відбувається?

Демонстрація: https://gfycat.com/idioticdizzyazurevase

Я вже створив мінімальний приклад, щоб виключити заголовки та кнопки навігаційної панелі, розділи форми та інші деталі:

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

Це відбувається в режимі попереднього перегляду, тренажері та на пристрої (Xcode 11.2, iOS 13.2 в тренажері, 13.3 бета-1 на пристрої).


На YouTube є досить недавнє відео, де демонструються основні форми в SwiftUI, воно там працює, тому, мабуть, це не помилка в самому SwiftUI: youtu.be/Ho88Eid9gi0?t=573
Корактор

Це ж питання - дуже дратує. Якщо ви використовуєте стиль вбудовування для навігаційного бар, він відходить.
DogCoffee

3
... також текст у клітинках стрибає - близько 4 пікс вправо
DogCoffee

2
@DogCoffee: Я налагодив горизонтальний стрибок, щоб змінити вставки. Це можна виправити, чітко встановивши їх .listRowInsets().
Корактор

дуже цінується, чудово працює.
DogCoffee

Відповіді:


6

Очевидно баггі поведінку можна подолати, коли змушують стиль перегляду навігації складатись:

NavigationView {}.navigationViewStyle(StackNavigationViewStyle())

Це вирішення моєї проблеми, але я не позначатиму це як прийняту відповідь (поки).

  1. Це здається помилкою, навіть якщо це може бути спровоковано особливими обставинами.
  2. Моє рішення не працюватиме, якщо вам потрібен інший стиль перегляду навігації.
  3. Крім того, воно не виправить горизонтальне перестановку, згадане DogCoffee у коментарях.

Це також корисно, якщо ваш додаток працює на iPad, інакше ваші модальні представлення представлені як головний детальний вид.
DogCoffee

2

На мою думку, це має щось спільне з навігаційною панеллю. За замовчуванням (не згадуючи про .navigationBarTitleрозширення), режим навігаційного дисплея встановлений .automatic, у цьому слід внести зміни .inline. Я натрапив на інший пост, подібний до цього, і використовую їх рішення для поєднання з вашим, використовуючи, це .navigationBarTitle("", displayMode: .inline)повинно допомогти.

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

Це вирішує проблему, але також змінює стиль заголовка, який у моєму випадку не бажаний.
Корактор

2

Поки ця помилка не буде вирішена, іншим способом вирішити цю проблему при збереженні DoubleColumnNavigationViewStyle для iPad було б умовно встановити цей стиль:

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

0

Дякую за цю тему всім! Дійсно допоміг мені зрозуміти щось більше і здолати одну із моїх проблем. Щоб поділитися з іншими, у мене була ця проблема, але у мене також була ця проблема, коли я встановив розділ, який відображатиметься в операторі if / else, встановленому на розділі з перемиканням. Після активації перемикання вона змістить заголовок розділу по горизонталі на кілька пікселів.

Далі, як я це виправив

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

У мене все ще спостерігається горизонтальний зсув у моєму вікні вибору вибору, і я не знаю, як це виправити. Я створив ще одну нитку для отриманого введення. Знову дякую! SwiftUI Shift Picker текст горизонтальний

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.