При использовании .edgesIgnoringSafeArea () макет SwiftUI выходит за пределы устройства. - PullRequest
0 голосов
/ 28 апреля 2020

Возникла проблема в SwiftUI, когда некоторые представления увеличиваются по вертикали по сравнению с размером устройства при использовании .edgesIgnoringSafeArea (.bottom). На iPhone 11 Pro, высота которого составляет 812 пикселей, я вижу представление размером 846. Я использую иерархию представления отладки, чтобы проверить это. Это было проверено на Xcode 11.4.1 и 11.1 и существует в обеих версиях и, вероятно, все между ними.

Я включил пример кода ниже.

Я почти уверен, что это ошибка SwiftUI , но было интересно, если у кого-нибудь есть обходной путь для этого. Мне нужен кодdgeIgnoringSafeArea (.bottom) для рисования панели вкладок и для того, чтобы ProfileView () расширялся до нижней части экрана, когда я скрываю свою панель пользовательских вкладок.

struct ContentView: View {
    var body: some View {
        MainTabView()
    }
}

struct MainTabView : View {
    var body: some View {
        VStack(spacing: 0.0) {
            ZStack {
                Color(.cyan)

                ProfileView()
            }
        }
        .edgesIgnoringSafeArea(.bottom) // <- This causes the screen to jump to 846
    }
}

struct ProfileView : View {
    @State private var showQuestionnaireView = false

    var body: some View {
        ZStack {
            NavigationView {

                NavigationLink(destination: QuestionnaireView( showQuestionnaireView:$showQuestionnaireView),
                               isActive: $showQuestionnaireView) {
                                Text("Show Questionnaire View")
                }
                .navigationBarTitle("")
                .navigationBarHidden(true)
            }
        }
    }
}

struct QuestionnaireView : View {
    @Binding var showQuestionnaireView : Bool

    var body: some View {
        GeometryReader { screenGeometry in
            ZStack {
                Color.orange
                VStack {
                    Text("Top")
                    Spacer()
                    Text("Bottom")
                }
            }
        }
    }
}

При запуске вы увидит кнопку, pu sh - кнопку и скрытое представление стека навигации нажимает на представление вопросника, это представление содержит VStack с двумя текстовыми полями, ни одно из которых вы не сможете увидеть из-за этой проблемы. Понятно, что верхняя часть находится за выемкой, а нижняя - за нижней частью экрана. В моем реальном проекте эту проблему редко замечают во время выполнения, но переключение между темным и светлым режимами показывает это. В приведенном выше коде нет необходимости менять внешний вид.

1 Ответ

0 голосов
/ 28 апреля 2020

Это связано с неопределенным размером для NavigationView. Когда вы добавляете свой пользовательский компонент панели вкладок, как в примере ниже, который ограничивает нижнюю область, NavigationView будет отображаться правильно.

Протестировано с Xcode 11.4 / iOS 13.4

demo

struct MainTabView : View {
    var body: some View {
        VStack(spacing: 0.0) {
            ZStack {
                Color(.cyan)
                ProfileView()   // << this injects NavigationView
            }
            HStack { // custom tab bar
                Button(action: {}) { Image(systemName: "1.circle").padding() }
                Button(action: {}) { Image(systemName: "2.circle").padding() }
                Button(action: {}) { Image(systemName: "3.circle").padding() }
            }.padding(.bottom)
        }
        .edgesIgnoringSafeArea(.bottom) // works !!
    }
}
...