使用 SwiftUI 将设备旋转到横向时出现导航栏

Posted

技术标签:

【中文标题】使用 SwiftUI 将设备旋转到横向时出现导航栏【英文标题】:Navigation Bar appearing when device is rotated to landscape using SwiftUI 【发布时间】:2021-03-24 19:57:21 【问题描述】:

屏幕工作正常(无导航栏):

iPhone 纵向模式 iPad 纵向模式 iPad 横向模式

它只在 iPhone 横向模式下显示导航栏。

任何人都可以建议我做错了什么或者即使在 iPhone 横向模式下也可以做些什么来消失导航栏? 提前致谢。

在此处附上纵向和横向模式的屏幕截图。

Navigation bar appearing in landscape mode

Working fine (no navigation bar) in portrait mode

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

【讨论】:

添加 .navigationBarHidden(true) 在此特定屏幕上工作正常,但是当我通过点击忘记密码转到 ForgotPassView() 时? (如上面的代码中所述),然后 ForgotPassView() 的导航栏以白色显示: - iPhone 纵向模式 - iPad 纵向模式 - iPad 横向模式和本机颜色,即 iPhone 横向模式的灰色(半透明)。如何在 iPhone 和 iPad 中以相同的方式处理这两种模式? 虽然我可以进行实验,但我不确定。听起来像是一个单独的问题。这个问题是如何隐藏我在这个答案中演示的导航栏,对吗?或者,也许您的问题是如何在后续视图中隐藏导航栏——您将不得不再次使用 .navigationBarHidden 我认为它是相互关联的,这就是为什么即使我需要单独隐藏导航栏(横向),当它在纵向模式下不可见时。因此,为了不在横向显示而使用 .navigationBarHidden(true) 隐藏导航栏看起来不是一个完美的解决方案。可能是我的问题是 SwiftUI 中的一个错误,并且以这种方式隐藏导航栏看起来不是一个好的解决方法。 老实说,如果您不想显示导航栏,这听起来有点像您不想使用 NavigationView。【参考方案2】:

谢谢,只是:

.navigationViewStyle(StackNavigationViewStyle())

为我工作!

【讨论】:

以上是关于使用 SwiftUI 将设备旋转到横向时出现导航栏的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:在横向列表中点击导航栏不会将列表滚动到顶部

自动旋转时出现 UIPopOverController 问题

带有表单的 SwiftUI 模态表:设备旋转后左/右填充错误

UINavigationController 导航栏在横向模式下不会缩小

在 SwiftUI 中使用 onAppear 时出现无限循环

旋转到横向时自动调整 UINavigationBar 的大小