Панель навигации, появляющаяся при повороте устройства в горизонтальное положение с помощью SwiftUI

#ios #swift #swiftui #swiftui-navigationlink #swiftui-navigationview

Вопрос:

Экран работает отлично (без панели навигации) в:

  • Портретный режим iPhone
  • Портретный режим iPad
  • Ландшафтный режим iPad

Он показывает панель навигации (из ниоткуда) только в ландшафтном режиме iPhone.

Кто-нибудь может, пожалуйста, подсказать, что я делаю не так или что можно сделать, чтобы панель навигации исчезла даже в ландшафтном режиме iPhone? Заранее спасибо.

Прикрепляем скриншоты как портретного, так и ландшафтного режима здесь.

Панель навигации, отображаемая в ландшафтном режиме

Нормально работает (без панели навигации) в портретном режиме

 struct LoginView: View {

@ObservedObject var vm = LoginVM()

var body: some View {
    NavigationView {
        VStack {
                TextField("Username", text: $vm.username)
                    .padding()
                    .overlay(RoundedRectangle(cornerRadius: 10)
                    .stroke(Color.blue, lineWidth: 0.5))
                    .padding([.top, .bottom])
                
                SecureField("Password / SMS Code", text: $vm.password)
                    .padding()
                    .overlay(RoundedRectangle(cornerRadius: 10)
                    .stroke(Color.blue, lineWidth: 0.5))
                    .padding(.bottom, 20)
                
                HStack {
                    Spacer()
                    NavigationLink(
                        destination: ForgotPassView(),
                        label: {
                            Text("Forgot Password ?")
                    }).padding(.bottom, 40)
            }
        }.padding()
    }
    .navigationViewStyle(StackNavigationViewStyle())
}
 

}

Ответ №1:

Добавьте .navigationBarHidden(true) в дочернее представление NavigationView :

 var body: some View {
        NavigationView {
            VStack {
                TextField("Username", text: $vm.username)
                    .padding()
                    .overlay(RoundedRectangle(cornerRadius: 10)
                                .stroke(Color.blue, lineWidth: 0.5))
                    .padding([.top, .bottom])
                
                SecureField("Password / SMS Code", text: $vm.password)
                    .padding()
                    .overlay(RoundedRectangle(cornerRadius: 10)
                                .stroke(Color.blue, lineWidth: 0.5))
                    .padding(.bottom, 20)
                
                HStack {
                    Spacer()
                    NavigationLink(
                        destination: ForgotPassView(),
                        label: {
                            Text("Forgot Password ?")
                        }).padding(.bottom, 40)
                }
            }
            .padding()
            .navigationBarHidden(true) //<-- here
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
 

Комментарии:

1. Добавление .navigationBarHidden(true) отлично работает на этом конкретном экране, но когда я перехожу в ForgotPassView (), нажав на Забыли пароль? (как указано в приведенном выше коде), затем панель навигации ForgotPassView() отображается белым цветом для : — портретного режима iPhone — портретного режима iPad — ландшафтного режима iPad и собственного цвета, т. е. серого (полупрозрачного) для ландшафтного режима iPhone. Что можно сделать, чтобы вести себя одинаково в iPhone и iPad в обоих режимах ?

2. Я не уверен до конца, хотя могу поэкспериментировать. Звучит как отдельный вопрос. Этот вопрос заключался в том, как скрыть панель навигации, которую я продемонстрировал в этом ответе, правильно? Или, возможно, ваш вопрос заключается в том, как скрыть панель навигации в последующих представлениях-вам придется снова использовать .navigationBarHidden

3. Я думаю, что это взаимосвязано, поэтому даже мне нужно скрывать панель навигации отдельно (для ландшафта), когда она не видна в портретном режиме. Поэтому скрытие навигационной панели с помощью .navigationBarHidden(true) только для того, чтобы не отображаться в альбомной ориентации, не выглядит идеальным решением. Возможно, моя проблема заключается в ошибке в SwiftUI, и скрытие навигационной панели таким образом не выглядит хорошим обходным путем.

4. Честно говоря, это звучит немного похоже на то, что, возможно, вы не хотите использовать NavigationView, если не хотите показывать навигационную панель.