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