SwiftUI中实现类似UIKit hidesBottomBarWhenPushed的平滑动画
实现平滑的标签栏隐藏效果
要实现和UIKit中hidesBottomBarWhenPushed一致的平滑动画,你需要借助UIKit的原生属性来同步导航过渡与标签栏的动画,而不是直接用SwiftUI的toolbar(.hidden)。以下是具体实现:
首先定义一个用于桥接UIKit属性的Modifier:
struct HideTabBarOnPush: ViewModifier { func body(content: Content) -> some View { content .background( UIKitTabBarHider() ) } } struct UIKitTabBarHider: UIViewControllerRepresentable { func makeUIViewController(context: Context) -> UIViewController { let helperVC = UIViewController() helperVC.hidesBottomBarWhenPushed = true return helperVC } func updateUIViewController(_ uiViewController: UIViewController, context: Context) {} } // 给View添加便捷扩展 extension View { func hideTabBarOnPush() -> some View { self.modifier(HideTabBarOnPush()) } }
然后修改你的ContentView,在详情视图上使用这个modifier即可:
struct ContentView: View { var body: some View { TabView { NavigationStack { NavigationLink { Text("Detail View") .hideTabBarOnPush() // 替换原来的toolbar(.hidden) } label: { Text("Navigation Link") .navigationTitle("Home") .navigationBarTitleDisplayMode(.inline) } } .tabItem { Label("Home", systemImage: "house") } } } }
原理说明
- 直接使用
toolbar(.hidden, for: .tabBar)是强制隐藏标签栏,没有和导航视图的推送动画做同步,所以会显得生硬。 - 通过UIKit的
hidesBottomBarWhenPushed属性,标签栏会和导航过渡动画绑定,在视图推送时平滑滑出,返回时平滑滑入,和UIKit原生效果完全一致。
内容的提问来源于stack exchange,提问作者Berry Blue
相关产品推荐
相关产品推荐

