导入presentationMode环境变量时自定义NavigationView搞砸了

Posted

技术标签:

【中文标题】导入presentationMode环境变量时自定义NavigationView搞砸了【英文标题】:Custom NavigationView gets messed up when importing the presentationMode Environment variable 【发布时间】:2021-03-06 13:45:07 【问题描述】:

我正在使用自定义导航栏视图和设置,我将其隐藏在主视图中并显示在子视图中。一切正常,直到我在孩子中添加了这一行:

@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

我需要在孩子中使用它,以便我们可以弹回主视图。现在,当我打开孩子然后单击返回(甚至不使用 env 变量)然后再次打开子视图时,导航栏不会像以前一样忽略安全区域。这是问题的 GIF:

在子视图中看到新的灰色空间了吗?

这是代码:

import SwiftUI

@main
struct NavBarApp: App 
    var body: some Scene 
        WindowGroup 
            NavigationView 
                MainView()
            
        
    


struct MainView: View 
    init() 
        let appearance = UINavigationBarAppearance()
        appearance.configureWithTransparentBackground()
        appearance.backgroundColor = .clear
        UINavigationBar.appearance().standardAppearance = appearance
        UINavigationBar.appearance().compactAppearance = appearance
        UINavigationBar.appearance().scrollEdgeAppearance = appearance
        UINavigationBar.appearance().isTranslucent = false
        UINavigationBar.appearance().prefersLargeTitles = false
    
    
    var body: some View 
        VStack 
            Spacer()
            NavigationLink("Go to child view", destination: ChildView())
            Spacer()
        
        .edgesIgnoringSafeArea(.all)
        .navigationBarHidden(true)
        .tabItem 
            Text("Home")
        
    


struct ChildView: View 
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    var body: some View 
        VStack 
            Rectangle()
                .frame(maxWidth: .infinity, maxHeight: 66)
                .foregroundColor(Color.black)
                .edgesIgnoringSafeArea(.all)
            Spacer()
            Text("Chlid View")
                .font(.largeTitle)
                .padding()
            Spacer()
        
        .edgesIgnoringSafeArea(.all)
        .navigationBarTitle("View A", displayMode: .inline)
        .navigationBarItems(trailing: AnyView(Button(action: 
        ) 
            Text("Add")
        ))
    

我注意到了什么:

    删除presentationMode 解决了这个问题。 未在子视图的导航栏上添加按钮可解决此问题。 不在 MainView 中自定义 NavigationBar 的外观也解决了这个问题。

关于发生了什么以及如何解决此问题的任何想法?

【问题讨论】:

【参考方案1】:

好的,我在外观设置中将其缩小到这一行:

UINavigationBar.appearance().isTranslucent = false

删除它解决了这个问题。删除它并没有影响自定义导航栏的外观,所以我现在将使用此解决方案。

【讨论】:

以上是关于导入presentationMode环境变量时自定义NavigationView搞砸了的主要内容,如果未能解决你的问题,请参考以下文章

presentationMode.wrappedValue.dismiss() 无法正常工作

SwiftUI中sheet弹出嵌在NavigationView中的子视图无法用presentationMode关闭(dismiss)弹出视图的解决

SwiftUI中sheet弹出嵌在NavigationView中的子视图无法用presentationMode关闭(dismiss)弹出视图的解决

如何在自定义助手中访问排毒元素匹配器?

使用自定义声明导入 Firebase 用户

访问 @Environment(\.presentationMode) 阻止 PDFView 出现