web-dev-qa-db-ja.com

ナビゲーション後にフォームの再配置でSwiftUIピッカーが使用されるのはなぜですか?

ピッカーをクリックすると、選択ビューに移動します。アイテムリストが上部からレンダリングされすぎていますが、アニメーションが終了するとスナップします。なんでこんなことが起こっているの?

デモ: 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)。

11
Koraktor

ナビゲーションビューのスタイルを強制的に積み重ねると、明らかにバグのある動作を回避できます。

NavigationView {
    …
}.navigationViewStyle(StackNavigationViewStyle())

これは私の問題の解決策ですが、これは(まだ)受け入れられた回答としてマークしません。

  1. たとえ特別な状況によって引き起こされたとしても、それはバグのようです。
  2. 別のナビゲーションビュースタイルが必要な場合、私のソリューションは機能しません。
  3. さらに、DogCoffeeがコメントで述べた水平方向の再配置は修正されません。
3
Koraktor

このバグが解決されるまで、iPadのDoubleColumnNavigationViewStyleを保持しながらこの問題を回避する別の方法は、条件付きでそのスタイルを設定することです。

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

私の意見では、ナビゲーションバーと関係があります。デフォルトでは(_.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
np2314