탐색 후 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
— Koraktor

같은 문제-매우 성가신. 탐색 표시 줄에 인라인 스타일을 사용하면 사라집니다.
— DogCoffee

3
... 또한 세포의 텍스트가 점프 - 4 픽셀에 대한 오른쪽
— DogCoffee

2
@ DoogCoffee : 가로 점프를 디버깅하여 삽입물을 변경했습니다. 로 명시 적으로 설정하면이 문제를 해결할 수 있습니다 .listRowInsets().
— Koraktor

대단히 감사하고 훌륭하게 작동합니다.
— DogCoffee 19

답변:


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

이것은 문제를 해결하지만 내 경우에는 원하지 않는 제목 스타일을 변경합니다.
— Koraktor

2

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

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 텍스트 가로

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.