【问题标题】:Swiftui invisible bar on the top of the screen屏幕顶部的 Swiftui 隐形栏
【发布时间】:2021-11-18 14:58:16
【问题描述】:

我有以下问题。 如果我尝试为视图提供颜色(例如 Color.red) 我得到以下输出:

我可以添加 .edgesignoressafearea(.top) 并且顶部也会变红。但是当我想添加一个可点击的项目时,用户将无法点击它,因为屏幕顶部仍然有这个不可见的栏。有谁知道我的问题是什么?问题出在所有选项卡视图(时间轴、收藏夹、发现、帐户)中。所以它必须在我在这篇文章中发送的第一个代码或 tabview(第二个代码)中。

当用户首先点击应用时,他们会看到此视图将用户发送到登录视图或应用本身:

var body: some View {
    NavigationView {
        VStack {
            NavigationLink(destination: tabView().navigationBarHidden(true), isActive: $tabview, label: { EmptyView() })
            NavigationLink(destination: loginView().navigationBarHidden(true), isActive: $login, label: { EmptyView() })
                
            if tabview == false && login == false {
                Text("loading")
                    .onAppear(perform: checklogin)
            }
        }
        .navigationBarBackButtonHidden(true)
        .navigationBarHidden(true)
    }
}

然后应用程序将它们发送到 tabview:

 var body: some View {
    TabView(selection: $selection) {
        Timeline()
            .tabItem {
                Label("timeline", systemImage: "house")
            }
            .tag(0)
        
        Favorits()
            .tabItem {
                Label("favorits", systemImage: "heart")
            }
            .tag(1)
        
        Discover()
            .tabItem {
                Label("discover", systemImage: "network")
            }
            .tag(2)
        
        Account()
            .tabItem {
                Label("account", systemImage: "person")
            }
            .tag(3)
    }
    .navigationBarBackButtonHidden(true)
    .navigationBarHidden(true)
 }

问题发生在所有这些视图上。 这是我截屏的视图:

var body: some View {
    ZStack {
        Color.red
        Text("Hello fav!")
    }
    .navigationBarBackButtonHidden(true)
    .navigationBarHidden(true)
}

【问题讨论】:

    标签: swift swiftui navigationbar


    【解决方案1】:

    如果您不想随时返回登录视图,请添加 .edgesIgnoringSafeArea(.top) 并删除导航栏。 这是带有登录页面的完整代码,现在取决于您在该登录页面上想要什么:

    import SwiftUI
    
    struct ContentView: View {
    @State var showLoginView: Bool = false
    
        var body: some View {
            VStack {
                if showLoginView {
                    MainView()
                } else {
                    Button("Login") {
                        self.showLoginView = true
                    }
                }
            }
        }
    }
    
    struct MainView: View {
        var body: some View {
            TabView {
                TimeLine()
                    .tabItem {
                        Label("timeline", systemImage: "house")
                    }
                Favorits()
                    .tabItem {
                        Label("favorits", systemImage: "heart")
                    }
                Discover()
                     .tabItem {
                         Label("discover", systemImage: "network")
                  }
                Account()
                     .tabItem {
                         Label("account", systemImage: "person")
                  }
            }
            
        }
        
    }
        
    struct TimeLine: View {
        var body: some View {
            Color.blue
                .edgesIgnoringSafeArea(.top)
        }
    }
    
    struct Favorits: View {
        var body: some View {
            ZStack {
                Color.red
                    .edgesIgnoringSafeArea(.top)
                Text("Hello fav!")
            }
        }
    }
    
    struct Discover: View {
        var body: some View {
            Color.yellow
                .edgesIgnoringSafeArea(.top)
        }
    }
    struct Account: View {
        var body: some View {
            Color.purple
                .edgesIgnoringSafeArea(.top)
        }
    }
    
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
                
        }
        
    }
    

    【讨论】:

    • @chrispsv 告诉我它是否能解决您的问题
    • 它确实使整个屏幕变红。但是白色(但现在是红色)的空间仍然存在。因此,例如,如果我将代替文本执行 VStack {Text(" hello fav!") Spacer() 文本将消失}
    • 是的,因为在我需要制作的视图中,顶部会有按钮。这些按钮无法点击,因为那个白色的东西是一种奇怪的覆盖层。我已经删除了所有的 .navigationTitle("") 但空白仍然存在。
    • 我试图更好地理解你想要做什么,因为我给出的代码只是为了有一个全红屏,中间有“hello fav”。但是你想要一个标签栏和一个导航栏吗?因为您拥有的空间可能就是您的导航栏
    • 不,红色只是为了表明在我所有的标签栏视图的顶部有一个大的白色不可见的东西。我想用顶部某处的按钮构建一个视图。但这将是不可能的,因为有一个看不见的大东西。使用 .edgesignoresafearea(.top) 我可以按照自己的意愿进行查看。这样做的问题是视图将在不可见的顶栏下绘制,因此每个按钮或可点击的东西都不起作用,因为用户将点击大的不可见顶栏而不是按钮本身。所以我试图弄清楚为什么有一个大的不可见的顶栏,我想摆脱它。
    【解决方案2】:

    您需要将导航标题设置为“”,因为您的视图嵌入在 NavigationView 中

    像这样创建一个 ViewModifier 并将其应用到您的 VStack

    struct HiddenNavBarModifier: ViewModifier {
        func body(content: Content) -> some View {
            content
            .navigationBarTitle("", displayMode: .inline)
            .navigationBarHidden(true)
        }
    }
    

    【讨论】:

    • 感谢您的反应。我已经把这个视图修饰符放在我所有的视图上。 ContentView -> Tabview -> Z-stack。但它不会改变外观。白条还在
    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2012-02-15
    • 2021-06-01
    相关资源
    最近更新 更多