Swift 4.0中如何让UINavigationBar与ViewController同色且避免TableView穿透?
解决Swift中导航栏与ViewController同色且避免TableView内容穿透的问题
我之前也碰到过一模一样的困扰,试了好几种思路才找到完美的解决方式。你遇到的核心问题在于导航栏默认的半透明特性、底部阴影线,以及ViewController的布局延伸规则,下面给你分步拆解可行方案:
基础适配方案(iOS 12及以下适用)
在你的ViewController的viewDidLoad方法里添加以下代码:
override func viewDidLoad() { super.viewDidLoad() let backGroundColor = UIColor.systemTeal // 替换成你需要的目标颜色 self.view.backgroundColor = backGroundColor // 1. 同步导航栏与VC的背景色 navigationController?.navigationBar.backgroundColor = backGroundColor navigationController?.navigationBar.barTintColor = backGroundColor // 2. 移除导航栏底部的阴影分割线 navigationController?.navigationBar.shadowImage = UIImage() // 3. 关键:避免TableView内容穿透导航栏 navigationController?.navigationBar.isTranslucent = true self.edgesForExtendedLayout = [] // 让VC的view从导航栏底部开始布局,不再延伸到导航栏下方 }
代码逻辑说明:
- 只设置
backgroundColor和barTintColor没用,因为导航栏默认自带一条底部阴影线,必须把shadowImage设为空来移除这条线,才能让颜色完全统一。 - 设置
isTranslucent = true是为了让导航栏的颜色渲染正常(如果设为false,导航栏的颜色显示逻辑会发生变化,容易出现色差),同时通过edgesForExtendedLayout = []限制VC的布局范围,这样TableView的顶部就会停在导航栏下方,不会穿透上去。
iOS 13+ 适配补充
iOS 13之后苹果推出了UINavigationBarAppearance来统一导航栏的外观设置,建议加上这段代码适配新版本系统:
if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() appearance.backgroundColor = backGroundColor appearance.shadowImage = UIImage() appearance.shadowColor = nil // 彻底清除阴影效果 // 应用到常规状态和滚动到顶部时的导航栏外观 navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance }
这样不管系统版本是多少,都能实现导航栏和ViewController背景色完全一致,同时TableView的内容也不会穿透到导航栏区域里。
内容的提问来源于stack exchange,提问作者Wagh
相关产品推荐
相关产品推荐

