如何在 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 中不起作用...... 还有其他解决方法吗?
【问题讨论】:
您可以使用fullScreenCover
或sheet
来代替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 应用程序中以编程方式检测 SwiftUI 的使用情况
SwiftUI 在新的 Foundation Formatters iOS 15 中更改语言
SwiftUI - 'windows' 在 iOS 15.0 中已弃用:使用 UIWindowScene.windows