iOS15 Beta 5下UITabBar高度差异及相关UI显示异常问题求助
iOS 15 栏类组件适配解决方案(Objective-C 场景)
UITabBar 高度变化、透明问题修复
iOS 15 新增了UITabBarAppearance配置类,旧版本的背景、样式设置逻辑默认失效,会触发透明、默认高度调整的表现。无需强制修改tabBar高度,符合系统设计规范的适配代码如下:
if (@available(iOS 15.0, *)) { UITabBarAppearance *tabBarAppear = [[UITabBarAppearance alloc] init]; // 配置为和旧版本一致的不透明磨砂背景 [tabBarAppear configureWithOpaqueBackground]; // 可按需替换为项目自定义的背景色 tabBarAppear.backgroundColor = [UIColor whiteColor]; // 如需隐藏tabBar顶部细线可开启下一行 // tabBarAppear.shadowColor = [UIColor clearColor]; // 应用到所有交互状态的tabBar self.tabBarController.tabBar.standardAppearance = tabBarAppear; self.tabBarController.tabBar.scrollEdgeAppearance = tabBarAppear; // 触发重布局后获取系统计算的合规高度 [self.tabBarController.tabBar layoutIfNeeded]; CGFloat currentTabBarHeight = self.tabBarController.tabBar.frame.size.height; // 后续所有底部组件的y坐标都基于该高度计算,不要硬编码旧版本的49固定值 }
UINavigationBar 透明问题修复
与UITabBar逻辑一致,使用新增的UINavigationBarAppearance配置即可恢复旧版本的不透明表现:
if (@available(iOS 15.0, *)) { UINavigationBarAppearance *navBarAppear = [[UINavigationBarAppearance alloc] init]; // 配置为和旧版本一致的不透明磨砂背景 [navBarAppear configureWithOpaqueBackground]; // 可按需替换为项目自定义的背景色 navBarAppear.backgroundColor = [UIColor whiteColor]; // 保持和旧版本一致的标题样式,可按需调整 navBarAppear.titleTextAttributes = @{ NSForegroundColorAttributeName: [UIColor blackColor], NSFontAttributeName: [UIFont systemFontOfSize:17 weight:UIFontWeightSemibold] }; // 应用到所有交互状态的导航栏 self.navigationController.navigationBar.standardAppearance = navBarAppear; self.navigationController.navigationBar.scrollEdgeAppearance = navBarAppear; }
修改完成后状态栏会自动和导航栏背景保持一致,不会再出现透明效果;如果是无导航栏的页面,可自行在状态栏对应位置添加自定义背景View,高度使用运行时获取的状态栏高度即可。
手动Frame布局全局适配建议
因为项目未使用AutoLayout,所有组件坐标计算需要废弃硬编码的固定栏高度值,统一在运行时动态获取对应组件的实际高度:
UIEdgeInsets safeArea = UIEdgeInsetsZero; CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height; CGFloat navBarHeight = self.navigationController.navigationBar.frame.size.height; CGFloat tabBarHeight = self.tabBarController.tabBar.frame.size.height; if (@available(iOS 11.0, *)) { safeArea = [UIApplication sharedApplication].keyWindow.safeAreaInsets; } // 计算当前页面可用展示高度 CGFloat availableDisplayHeight = [UIScreen mainScreen].bounds.size.height - statusBarHeight - navBarHeight - tabBarHeight - safeArea.top - safeArea.bottom;
所有子视图的frame都基于以上动态计算的数值排布,无需修改系统原生栏的默认尺寸,完全符合iOS 15设计规范,同时兼容全版本系统表现。
内容的提问来源于stack exchange,提问作者Carl Hine
相关产品推荐
相关产品推荐

