ナビゲーション後にフォームの再配置で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)。


SwiftUIに基本的なフォームを実証YouTubeでかなり最近のビデオは、私はそれがSwiftUI自体のバグではありませんだと思うので、それは、そこに働いている、があります:youtu.be/Ho88Eid9gi0?t=573
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

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

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

0

みんなこのスレッドをありがとう!本当に私が物事をより理解し、私の問題の1つを把握するのに役立ちました。他の人と共有するために、私はこの問題を抱えていましたが、トグルを使用してセクションに設定された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 Horizo​​ntal

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.