Возникла проблема в 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 с двумя текстовыми полями, ни одно из которых вы не сможете увидеть из-за этой проблемы. Понятно, что верхняя часть находится за выемкой, а нижняя - за нижней частью экрана. В моем реальном проекте эту проблему редко замечают во время выполнения, но переключение между темным и светлым режимами показывает это. В приведенном выше коде нет необходимости менять внешний вид.