Swift 去掉选项卡视图中的导航栏

Swift 去掉选项卡视图中的导航栏,swift,swiftui,Swift,Swiftui,我有以下实施: 视图_1:包含一个navigationView和两个按钮,如下所示 NavigationView { GeometryReader { gr in ZStack { VStack(alignment: HorizontalAlignment.center, spacing: 10) { HStack{

我有以下实施:

视图_1:包含一个navigationView和两个按钮,如下所示

NavigationView {
                GeometryReader { gr in
                ZStack {
                    VStack(alignment: HorizontalAlignment.center, spacing: 10) {
                        HStack{
                            Spacer()
                        }
                        Text("1").foregroundColor(.white).padding(EdgeInsets(top: 30, leading: 0, bottom: 0, trailing: 0))
                        Text("2").foregroundColor(.white)
                        Spacer()
                        HStack {
                            NavigationLink(destination: SigninScreen()){
                                Text("Button 1")
                            }

                            Button(action: {}){
                                Text("Button 2")
                            }
                        }.padding()
                    }.background(Image("bg-welcome")
                        .resizable()
                        .aspectRatio(contentMode: .fill)).edgesIgnoringSafeArea(.all)
                }.navigationBarHidden(true)
            }
然后显示目标屏幕(SigninScreen):

最后一个观点是:

struct MainScreen: View {
    var body: some View {
        TabView(){
            HomeScreen()
                .tabItem {
                    Image(systemName: "house")
                    Text("Home")
            }
            EventsScreen()
                .tabItem {
                    Image(systemName: "calendar")
                    Text("Events")
            }
            NewsScreen()
                .tabItem {
                    Image(systemName: "info")
                    Text("News")
            }

        }
    }
}

struct MainScreen_Previews: PreviewProvider {
    static var previews: some View {
        MainScreen()
    }
}
homeview的实现如下所示

struct HomeScreen: View {
    var body: some View {
        VStack {
            HStack{
                Spacer()
            }
            Text("cacaca")
            Spacer()
        }.background(Color.yellow).padding(EdgeInsets(top: -150, leading: 0, bottom: 0, trailing: 0))

    }
}

struct HomeScreen_Previews: PreviewProvider {
    static var previews: some View {
        HomeScreen()
    }
}
我的问题是navigationbar占用了我想在视图顶部使用的空间 而且,我也不能将标题附加到homeview,例如,如果不添加新的navigationview。在我想要显示的内容之前,它在顶部增加了更多的空间

你知道怎么解决这个问题吗


听起来您好像在使用
导航视图
在视图之间转换,但实际上您并不需要
导航视图
的功能(顶部的标题、后退按钮、尾部按钮等)

因此,与其让主视图在
NavigationView
中处于两个深度,我建议使用三个未加标记的视图:
WelcomeScreen
SigningScreen
MainScreen
。然后,您的内容视图应根据应用程序的状态在这些视图之间显示/转换

关于如何在它们之间进行转换(使视图的不透明度淡入淡出,使视图滑入屏幕和滑出屏幕等),有很多种可能性。请参阅带有图片的完整示例,但它可能看起来像:

class LoginStateModel: ObservableObject {
    enum CurrentView {
        case welcome, login, home
    }

    @Published var currentView = CurrentView.login
}

struct StackOverflowTests: View {
    @ObservedObject var model = LoginStateModel()

    var body: some View {
        ZStack {
            if model.currentView == .welcome {
                WelcomeScreen()
            } else if model.currentView == .login {
                SigninScreen()
            } else {
                MainScreen()
            }
        }
        .environmentObject(model)
    }
}
模型通过
.environmentObject
传递给子视图,以便它们可以修改它(例如,
登录时将模型设置为
.home
,或
主屏幕
注销时将模型设置为
.login



作为附录,您实际上可以通过在
主体
属性的某个地方(如
选项卡
上)包含另一个
.navigationBarTitle
修改器,为
主屏幕
设置一个新标题。但是我仍然建议去掉上面提到的
NavigationView

使用此扩展来隐藏navigationbar

extension View {
  func hideNavigationBar() -> some View {
        self
          .navigationBarTitle(Text(""))
          .navigationBarHidden(true)
    }
}
extension View {
  func hideNavigationBar() -> some View {
        self
          .navigationBarTitle(Text(""))
          .navigationBarHidden(true)
    }
}