You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何获取TabBar的高度?

在SwiftUI中获取TabBar高度的几种方法

嘿,我来帮你搞定SwiftUI里获取TabBar高度的问题~你在UIKit里用扩展获取TabBar高度的思路很清晰,但SwiftUI是声明式框架,没有直接对应的TabBarController实例可以直接扩展,不过我们有几种等效的实现方式,一起来看看:

方法一:利用UIKit外观代理获取默认高度

这是最简单的方式,直接复用UIKit的API获取TabBar的默认高度,但要注意这个值不包含底部安全区高度,所以在iPhone X及以后的设备上,实际显示的TabBar高度会是这个值加上安全区底部高度,准确性有限:

let defaultTabBarHeight = UITabBar.appearance().frame.size.height
// 如果你需要包含安全区的高度,可以加上:
let safeAreaBottomHeight = UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0
let totalTabBarHeight = defaultTabBarHeight + safeAreaBottomHeight

方法二:用PreferenceKey捕获实际渲染高度(推荐)

这是最准确的方式,符合SwiftUI的声明式风格,能获取到TabBar实际渲染后的真实高度(包含安全区)。步骤如下:

  1. 先定义一个PreferenceKey用来传递高度值:
struct TabBarHeightPreferenceKey: PreferenceKey {
    static var defaultValue: CGFloat = 0
    static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
        value = nextValue()
    }
}
  1. 在你的TabView上添加背景,用GeometryReader捕获高度并通过Preference传递:
struct ContentView: View {
    @State private var tabBarHeight: CGFloat = 0
    
    var body: some View {
        TabView {
            Text("首页")
                .tabItem {
                    Image(systemName: "house")
                    Text("首页")
                }
            Text("我的")
                .tabItem {
                    Image(systemName: "person")
                    Text("我的")
                }
        }
        .background(
            GeometryReader { proxy in
                Color.clear
                    .preference(key: TabBarHeightPreferenceKey.self, value: proxy.size.height)
            }
        )
        .onPreferenceChange(TabBarHeightPreferenceKey.self) { newHeight in
            tabBarHeight = newHeight
            print("实际TabBar高度:\(tabBarHeight)")
        }
    }
}

这样你就能在tabBarHeight变量里拿到真实的TabBar高度,随时供其他视图使用。

方法三:桥接UIKit获取TabBarController实例

这个方法和你原来UIKit的扩展思路最像,通过获取当前的UITabBarController实例来获取高度。需要注意的是,要正确遍历视图控制器层级找到TabBarController:

首先给UIViewController加个扩展来递归查找TabBarController:

extension UIViewController {
    func findTabBarController() -> UITabBarController? {
        if let tabBarVC = self as? UITabBarController {
            return tabBarVC
        }
        // 递归查找子视图控制器
        for childVC in children {
            if let tabBarVC = childVC.findTabBarController() {
                return tabBarVC
            }
        }
        return nil
    }
}

然后在SwiftUI里调用这个方法获取高度:

func getTabBarHeight() -> CGFloat {
    guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
          let rootVC = windowScene.windows.first?.rootViewController,
          let tabBarVC = rootVC.findTabBarController() else {
        return 0
    }
    return tabBarVC.tabBar.frame.size.height
}

不过这种方法依赖于App的视图控制器结构,如果你的SwiftUI App用了WindowGroup,根视图控制器可能是SwiftUI的容器,所以需要确保TabBarController确实存在于层级中。


内容的提问来源于stack exchange,提问作者kaddie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:17:38