Почему средство выбора 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 beta 1 на устройстве).


На YouTube есть довольно недавнее видео, демонстрирующее основные формы в SwiftUI, оно работает там, так что я думаю, что это не ошибка в самом SwiftUI
Koraktor

Та же проблема - очень раздражает. Если вы используете встроенный стиль для навигационной панели, она исчезнет.
DogCoffee

3
... также текст в ячейках прыгает - примерно на 4 пикселя вправо
DogCoffee,

2
@DogCoffee: я отлаживал горизонтальные прыжки, чтобы менять вставки. Это можно исправить, явно установив их с помощью .listRowInsets().
Koraktor

высоко ценится, прекрасно работает.
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 Text Горизонтально

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.