当我在导航堆栈上推送新视图时,我想隐藏选项卡栏。我尝试了这个,它有效,但它不是一个平滑的选项卡动画。有没有办法创建与 UIKit 中的
hidesBottomBarWhenPushed
相同的动画?
struct ContentView: View {
var body: some View {
TabView {
NavigationStack {
NavigationLink {
Text("Detail View")
.toolbar(.hidden, for: .tabBar)
} label: {
Text("Navigation Link")
.navigationTitle("Home")
.navigationBarTitleDisplayMode(.inline)
}
}
.tabItem {
Label("Home", systemImage: "house")
}
}
}
}
好吧,这是可以做到的,但苹果范例建议你不要这样做。我的应用程序中确实发生了完全相同的事情,因为我想从工具栏显示“通知”屏幕。它也嵌套在 TabView 中。您可以执行此操作的方法是创建一些值
$hidesTabBar
,每当您单击导航链接时,该值都会设置为 true 。您可以通过使用 .navigationDestination(isPresented...)
和定义的 Binding<Bool>
将这两个东西结合在一起,该定义监听 .onChange
修饰符的 isPresented
的 .navigationDestination
。在使该 hack 工作时,您将遇到一些奇怪的情况,即您需要将该绑定传递给 TabView
中的每个视图或将其添加到 .environment
。
既然你已经有了一个可行的解决方案,你应该知道苹果是如何看待这个问题的。如果你查看他们所有具有 TabView 的本机应用程序,他们总是使用
.sheet
、.popover
或带有 .fullscreenCover
按钮的 Done
。这是用户期望看到的,也是他们习惯看到的。此外,当他们在 TabView
内时,如果他们碰巧因任何特定原因更改了选项卡,他们总是希望被带回到他们离开的地方。这是您应该认真考虑的用户体验问题。