iOS双Tab Bar重定位后原位置黑块问题解决求助
解决iOS TabBar移到顶部后底部出现黑块的问题
兄弟,我太懂这种踩坑的感觉了!你遇到的这个底部黑块,本质是UITabBarController默认自带的TabBar在搞事情——要么是你用了自定义TabBar但没处理系统原生的,要么是移动位置后系统的布局约束还在留着占位。下面给你几个靠谱的解决办法:
方法1:隐藏系统原生TabBar+调整布局(适合用自定义TabBar的情况)
从你的代码看,你已经拖了一个自定义的bar作为IBOutlet,那大概率是系统原来的TabBar还在底部躺着,只是被你忽略了。直接把它藏起来,再让控制器的视图铺满整个屏幕就行:
override func viewDidLoad() { super.viewDidLoad() // 1. 藏起系统自带的TabBar self.tabBar.isHidden = true // 2. 让控制器的视图延伸到屏幕底部,干掉原来TabBar的占位 self.extendedLayoutIncludesOpaqueBars = true self.edgesForExtendedLayout = .all // 3. 保险起见,给控制器的view设置背景色(避免露出黑色) self.view.backgroundColor = .white }
方法2:直接移动系统TabBar(不用自定义的情况)
如果你不想搞自定义TabBar,直接改系统TabBar的位置就行,同时调整安全区域避免内容被挡住:
override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() guard let tabBar = self.tabBar else { return } // 把TabBar移到导航栏下方(如果没有导航栏就设为0) let topY = self.navigationController?.navigationBar.frame.maxY ?? 0 tabBar.frame = CGRect(x: 0, y: topY, width: tabBar.frame.width, height: tabBar.frame.height) // 调整安全区域,让子控制器的内容避开顶部的TabBar self.additionalSafeAreaInsets = UIEdgeInsets(top: tabBar.frame.height, left: 0, bottom: 0, right: 0) // 让视图延伸到底部,消除底部占位黑块 self.extendedLayoutIncludesOpaqueBars = true }
注意点
- 别直接用
frame硬改布局(除非在viewWillLayoutSubviews里),AutoLayout会偷偷把位置改回去,最好用约束来固定自定义TabBar的位置 - 如果是Storyboard里拖的自定义TabBar,要确保它的约束是绑在顶部/导航栏底部,而不是底部
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

