如何在 iOS 15 中使用 SwiftUI 在特定视图中隐藏 TabBar

Posted

技术标签:

【中文标题】如何在 iOS 15 中使用 SwiftUI 在特定视图中隐藏 TabBar【英文标题】:How can I Hide TabBar in specific Views, in iOS 15 using SwiftUI 【发布时间】:2021-12-15 17:46:44 【问题描述】:

如果我点击NavigationLink,我需要我的TabBar 消失。 我知道您可以使用以下代码在 ios 14 中实现这一点:

 NavigationView
        TabView
            View1().tabItem 
                Image(systemName: "house.fill")
                Text("Home")
            
        
    

还有View1:

struct View1: some View 
var body: some View 
    NavigationView
        NavigationLink(destination: Text("New Page without the Tabbar")) 
            Text("Link")
        
    


但不知何故,这在 iOS 15 中不起作用...... 还有其他解决方法吗?

【问题讨论】:

您可以使用fullScreenCoversheet 来代替NavigationLink 来显示目的地吗?为什么要对抗系统? 【参考方案1】:

这取决于你想做什么,但你现在应该看 Apple 的观点,他们不鼓励这种做法。

当人们导航到不同的区域时,避免隐藏标签栏 你的应用程序。标签栏是您应用的全局导航控件,因此 确保它始终可见。例外是一个标签栏 模态视图。因为模态视图给人们一个单独的体验 他们完成后关闭,隐藏视图的标签栏 不影响应用导航。

https://developer.apple.com/design/human-interface-guidelines/ios/bars/tab-bars/

您可能会遇到使用此设置获得批准的问题。

您可以在选择更改时触发视图中的更改

struct FakeTabView2: View 
    @State var selection: FakeTabView2.Tabs = .view2
    @State var visible: Bool = false
    var body: some View 
        NavigationView
            VStack
                if selection.isTabBarVisible(selection: selection)
                    TabView(selection: $selection)
                        Text("")
                            .tabItem 
                                Image(systemName: FakeTabView2.Tabs.view1.systemImageName())
                                Text(FakeTabView2.Tabs.view1.rawValue)
                            .tag(FakeTabView2.Tabs.view1)
                        FakeTabViewView2()
                            .tabItem 
                                Image(systemName: FakeTabView2.Tabs.view2.systemImageName())
                                Text(FakeTabView2.Tabs.view2.rawValue)
                            .tag(FakeTabView2.Tabs.view2)
                    
                else
                    switch selection
                    case .view1:
                        FakeTabViewView1()
                    default:
                        EmptyView()
                    
                
            
            //Unique title based on selection
            .navigationTitle(selection.rawValue)
        
    
    
    enum Tabs: String, CaseIterable
        case view1 = "Home"
        case view2
        
        func isTabBarVisible(selection: Tabs) -> Bool
            var result = true
            switch selection
            case .view1:
                result = false
            default:
                result = true
            
            return result
        
        
        func systemImageName() -> String
            switch self 
            case .view1:
                return "house.fill"
            case .view2:
                return "person"
            
        
        
    

【讨论】:

【参考方案2】:

您可以尝试只使用一个NavigationView,如下例所示:

import SwiftUI

@main
struct TestApp: App 
    var body: some Scene 
        WindowGroup 
            ContentView()
        
    


struct ContentView: View 
    var body: some View 
        NavigationView 
            TabView 
                View1().tabItem 
                    Image(systemName: "house.fill")
                    Text("Home")
                
            
        
    


struct View1: View 
    var body: some View 
        // ---> here no NavigationView
        NavigationLink(destination: Text("New Page without the Tabbar")) 
            Text("Link")
        
    

【讨论】:

使用提供的代码,答案对我来说效果很好,当我点击 NavigationLink 时,TabBar 消失了,这就是 ios 15 的问题。在 ios 15 和 macCatalyst 12 上进行了真实测试设备,使用 macOS 12.1 beta、Xcode 13.1。这对某人不起作用吗?或者为什么投反对票? 有一个问题:每个 NavigationView 只能设置一个 Navigationtitle。这意味着如果 TabBar 包含 3 个选项卡,则它们都具有相同的标题/工具栏。 正如@Max 所说,如果 TabBar 有多个具有不同标题的不同选项卡,这将不起作用:( 嗯,这里有点糊涂,@Max 说的是...one Navigationtitle per NavigationView..,而你说的是TabBar has multiple different Tabs with Different Headings。您能否向我们展示一个示例代码,用您需要的功能复制您的问题。

以上是关于如何在 iOS 15 中使用 SwiftUI 在特定视图中隐藏 TabBar的主要内容,如果未能解决你的问题,请参考以下文章

iOS 15 中的 Swift 和 SwiftUI

如何在 iOS 应用程序中以编程方式检测 SwiftUI 的使用情况

SwiftUI 在新的 Foundation Formatters iOS 15 中更改语言

无法更改 iOS 15 SwiftUI 列表部分标题填充

SwiftUI - 'windows' 在 iOS 15.0 中已弃用:使用 UIWindowScene.windows

iOS 15.3+ SwiftUI的Form视图中嵌入List及Button若干诡异行为的解决