탐색 후 SwiftUI 선택기가 양식 재배치에있는 이유는 무엇입니까? Picker(“Client”, selection: $name) {

선택기를 클릭하면 선택보기로 이동합니다. 항목 목록이 맨 위에서 너무 멀리 렌더링되지만 애니메이션이 완료된 후 스냅됩니다. 왜 이런 일이 발생합니까?

데모 : 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)에서 발생합니다.



답변

탐색 뷰 스타일을 쌓아 올릴 때 분명히 버그가있는 동작을 해결할 수 있습니다.

NavigationView {}.navigationViewStyle(StackNavigationViewStyle())

이것은 내 문제에 대한 해결책이지만 이것을 받아 들인 대답으로 표시하지는 않습니다 (아직).

  1. 특별한 상황에 의해 유발 될지라도 버그 인 것 같습니다.
  2. 다른 탐색보기 스타일이 필요한 경우 내 솔루션이 작동하지 않습니다.
  3. 또한 주석에서 DogCoffee가 언급 한 수평 재배치를 수정하지 않습니다.

답변

내 생각에는 탐색 모음과 관련이 있습니다. 기본적으로 ( .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()
    }
}

답변

이 버그가 해결 될 때까지이 문제를 해결하는 다른 방법은 iPad 용 DoubleColumnNavigationViewStyle을 유지하면서 해당 스타일을 조건부로 설정하는 것입니다.

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

답변

이 스레드 모두에게 감사합니다! 실제로 더 이해하고 문제 중 하나를 파악하는 데 실제로 도움이되었습니다. 다른 사람들과 공유하기 위해이 문제가 있었지만 토글이있는 섹션의 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 텍스트 가로