IOS15的导航栏高度和状态栏高度和tabBar高度的获取

本文介绍了在iOS15中如何正确且不触发警告地获取导航栏、状态栏和tabBar的高度,强调了避免使用过期API如[UIApplication sharedApplication].keyWindow,并提供了使用UIWindowScene的Swift代码示例,根据iPhone13模拟器测试,状态栏高度为47,导航栏高度为44,tabBar高度为83,提醒开发者在不同设备上需要动态获取这些高度。

IOS15的导航栏高度和状态栏高度和tabBar高度的获取

这都2021年11月份了。还在有人使用[UIApplication sharedApplication].keyWindow
这样过期的api?。虽然能用,但是报警告。苹果提供了UIWindowScene这个类。这部分属于冷门知识,资料很少。swift的写法还是有的。swift其实跟oc一个道理,就是换种写法而已,本质上没变

-(void)setupTitleView{
   
   
    UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 44+47, kScreenW, 44)];
    titleView.backgroundColor = UIColor.systemGray4Color;
    [self.view addSubview:titleView];
    NSLog(@"navigationBar %@",NSStringFromCGRect
<think>好的,我现在需要回答用户关于如何在iOS获取TabBar高度底部安全区域高度的问题。首先,我要回忆一下相关的iOS开发知识,尤其是关于界面布局安全区域的部分。 用户提到了两个部分:TabBar高度底部安全区域的高度。我记得在iOS中,特别是从iPhone X开始,引入了安全区域的概念,用来处理刘海屏底部Home条的区域。安全区域可以通过safeAreaInsets来获取,而TabBar作为界面元素,可能有自己的高度。 首先,关于底部安全区域的高度。在UIView中,确实有safeAreaInsets这个属性,它是一个UIEdgeInsets结构体,包含了上下左右的inset值。要获取底部安全区域的高度,可以访问safeAreaInsets.bottom。不过需要注意,这个值在不同的设备方向下可能不同,比如在iPhone X及以上机型中,底部有Home条时,这个值会是非零的。此外,这个属性通常在视图布局完成后才能正确获取,所以最好在viewDidLayoutSubviews方法中访问它,或者在Auto Layout中使用safeAreaLayoutGuide来约束视图。 接下来是TabBar高度。标准的UITabBarController中的TabBar,默认高度在竖屏下通常是49点(points),但可能有变化,尤其是在横屏模式或某些设备上。为了准确获取高度,可以通过tabBar.frame.size.height来获取当前TabBar的实际高度。不过需要注意,如果TabBar是隐藏的,或者被自定义过,这个高度可能会不同。此外,在iOS 11及以上,应该结合安全区域来布局,避免内容被遮挡。 另外,用户提供的引用中提到了一些相关的内容,比如safeAreaLayoutGuidecontentInsetAdjustmentBehavior。引用[2]提到UIView的safeAreaLayoutGuide属性,这是一个UILayoutGuide类型,代表不被状态栏导航栏等遮挡的安全区域。因此,获取底部安全区域的高度可能需要使用这个布局指南的布局约束或者直接读取safeAreaInsets。 现在需要把这些信息整理成步骤,告诉用户如何具体实现。可能还需要考虑不同iOS版本的兼容性,比如在iOS 11之前没有safeAreaInsets,但用户现在可能主要支持较新的iOS版本。 此外,用户可能是在SwiftUI或者UIKit环境下开发。根据引用[4]中的内容,用户可能在使用SwiftUI,因为提到了ContentView结构体、状态变量ZStack等SwiftUI元素。但问题本身更偏向UIKit的术语,比如UIViewController、UITabBar等,所以可能需要区分两种情况:UIKitSwiftUI中的获取方法。 在UIKit中,获取底部安全区域的高度可以通过UIView的safeAreaInsets,而TabBar高度可以通过其frame。在SwiftUI中,可能需要使用GeometryReader来获取安全区域视图的高度信息。例如,使用GeometryReader读取safeAreaInsets.bottom,或者获取TabBar的几何信息。 不过,用户的问题并没有明确说明是UIKit还是SwiftUI,所以可能需要同时给出两种环境下的解决方案。但根据引用[4],用户可能正在使用SwiftUI,因为示例代码中有ContentView结构体状态变量,但问题中的术语如“TabBar”更常见于UIKit。需要确认这一点,但作为回答,可能需要涵盖两种可能的情况。 现在,需要组织回答的结构:首先介绍如何获取TabBar高度,然后底部安全区域的高度,最后注意事项。可能需要提供代码示例,并指出不同情况下的处理方式。 另外,需要确保代码的正确性。例如,在UIKit中,在viewDidLayoutSubviews中获取tabBar高度,或者在视图控制器的视图层级中访问tabBar的实例。如果用户使用的是自定义的TabBar,可能需要不同的处理方式。 还需要注意,如果TabBar被隐藏了,那么其高度可能为0,或者在视图层级中不存在,所以代码需要考虑这种情况。此外,安全区域的高度在设备旋转时会变化,因此可能需要监听相关通知或者确保在布局更新后获取最新的值。 总结步骤: 1. 获取TabBar高度: - 在UIKit中,访问UITabBar的frame.size.height。 - 在SwiftUI中,可能需要使用GeometryReader或者自定义视图来测量高度。 2. 获取底部安全区域的高度: - 在UIKit中,访问视图的safeAreaInsets.bottom。 - 在SwiftUI中,使用GeometryReader读取safeAreaInsets.bottom。 3. 注意事项:确保在布局完成后获取正确的值,处理不同设备方向的情况,考虑是否存在TabBar实例等。 现在,将这些整理成用户友好的回答,提供代码示例,并引用相关的引用内容,比如引用[2]提到的safeAreaLayoutGuide,以及引用[4]中的示例可能涉及的SwiftUI代码。 最后,生成相关问题,帮助用户深入理解。</think>在 iOS 开发中获取 TabBar 高度底部安全区域高度的方法如下: --- ### **1. 获取 TabBar 高度** 在 UIKit 中,通过 `UITabBar` 的 `frame` 属性直接获取高度: ```swift let tabBarHeight = tabBarController?.tabBar.frame.size.height ?? 49.0 // 默认高度为 49 ``` 若使用自定义 TabBar,需确保在 `viewDidLayoutSubviews` 中获取最新值: ```swift override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let tabBarHeight = tabBar.frame.size.height } ``` --- ### **2. 获取底部安全区域高度** 通过 `safeAreaInsets` 或 `safeAreaLayoutGuide` 获取: ```swift // 方式 1:直接读取 safeAreaInsets let bottomSafeArea = view.safeAreaInsets.bottom // 方式 2:通过 safeAreaLayoutGuide 获取(更适合 Auto Layout) let guide = view.safeAreaLayoutGuide let bottomSafeArea = view.frame.maxY - guide.layoutFrame.maxY ``` 在 SwiftUI 中,使用 `GeometryReader`: ```swift GeometryReader { geometry in let bottomSafeArea = geometry.safeAreaInsets.bottom } ``` --- ### **3. 注意事项** - **布局时机**:确保在 `viewDidLayoutSubviews` 中获取值,避免布局未完成时返回错误结果。 - **横竖屏适配**:设备旋转时需重新计算。 - **TabBar 可见性**:若 TabBar 被隐藏,其高度为 0。 - **版本兼容**:`safeAreaInsets` 仅支持 iOS 11+,旧版本需用 `bottomLayoutGuide`[^2]。 --- ### **代码示例(UIKit)** ```swift class ViewController: UIViewController { override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // 获取 TabBar 高度 let tabBarHeight = tabBarController?.tabBar.frame.size.height ?? 49.0 // 获取底部安全区域高度 let bottomSafeArea = view.safeAreaInsets.bottom print("TabBar 高度: \(tabBarHeight)") print("底部安全区域高度: \(bottomSafeArea)") } } ``` --- ### **相关引用** - `safeAreaLayoutGuide` 用于描述不被状态栏导航栏遮挡的安全区域[^2]。 - 在 iOS 11+ 中优先使用 `contentInsetAdjustmentBehavior` 替代旧版布局属性[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值