如何让UITabBarController的视图内容显示在Tab Bar上方?
问题:如何让UITabBarController的视图内容不延伸到Tab Bar下方?
我用Swift实现了一个UITabBarController,代码如下:
class ViewController: UIViewController { private let button: UIButton = { let button = UIButton(frame: CGRect(x:0, y:0, width: 200, height: 52)) button.setTitle("Log in", for: .normal) button.backgroundColor = .white button.setTitleColor(.black, for: .normal) return button }() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBlue view.addSubview(button) button.addTarget(self, action: #selector(didTapButton), for: .touchUpInside) } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() button.center = view.center } @objc func didTapButton(){ let tabBarVC = UITabBarController() let vc1 = FirstViewController() let vc2 = SecondViewController() let vc3 = ThirdViewController() let vc4 = FourthViewController() let vc5 = FifthViewController() vc1.title = "Home" tabBarVC.setViewControllers([vc1], animated: false) tabBarVC.modalPresentationStyle = .fullScreen present(tabBarVC, animated: true) } } class FirstViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .orange title = "Home" } }
(为精简内容,省略了其他控制器代码)
当前运行结果:
期望效果:
解决方法
问题根源是UIViewController默认布局会让视图延伸到半透明的Tab Bar下方,可通过以下方式调整:
在子ViewController中设置布局延伸属性
在每个Tab对应的ViewController(比如FirstViewController)的viewDidLoad方法里添加:// 完全禁止视图延伸到导航栏、Tab Bar之外的区域 edgesForExtendedLayout = []若需要保留顶部导航栏的延伸效果,仅禁止底部:
edgesForExtendedLayout = .top关闭Tab Bar的半透明属性
创建TabBarController时,设置Tab Bar为不透明,系统会自动调整子视图布局:@objc func didTapButton(){ let tabBarVC = UITabBarController() // 添加这一行修改Tab Bar透明度 tabBarVC.tabBar.isTranslucent = false // 其余代码不变... }注意:此设置会改变Tab Bar的视觉样式,变为完全不透明背景。
创建基类统一设置
若多个Tab页面需要相同布局规则,可创建一个基类ViewController,将布局属性设置放在基类中,其他Tab页面继承该基类即可,避免重复代码。
内容的提问来源于stack exchange,提问作者Tom Brooke
相关产品推荐
相关产品推荐

