如何移除自定义导航栏中的黑色线条?我已在自定义导航控制器viewDidLoad中添加代码
移除自定义导航控制器导航栏的黑色线条
嘿,这个问题我之前踩过坑!那条烦人的黑色线条其实是导航栏默认的阴影层,给你几个实用的解决办法,适配不同的iOS版本:
方法一:直接隐藏阴影与背景图(通用iOS版本)
这是最经典的方案,直接把导航栏的shadowImage设为空图,同时配合设置空的背景图(iOS的导航栏机制要求两者一起设置才会生效)。
在你的自定义导航控制器的viewDidLoad方法里添加代码:
Swift 版本
override func viewDidLoad() { super.viewDidLoad() // 移除导航栏阴影线 navigationBar.shadowImage = UIImage() // 配合设置空背景图,确保阴影完全消失 navigationBar.setBackgroundImage(UIImage(), for: .default) }
Objective-C 版本
- (void)viewDidLoad { [super viewDidLoad]; // 移除导航栏阴影线 [self.navigationBar setShadowImage:[UIImage new]]; // 配合设置空背景图 [self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; }
方法二:适配自定义背景色的场景
如果你的导航栏需要保留自定义背景色,不想用空背景图,可以把阴影设为空,同时让背景图和导航栏颜色匹配:
Swift 版本(需添加UIImage颜色扩展)
// 先实现一个UIImage的扩展,用于生成纯色图片 extension UIImage { convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) { let rect = CGRect(origin: .zero, size: size) UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) color.setFill() UIRectFill(rect) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() guard let cgImage = image?.cgImage else { return nil } self.init(cgImage: cgImage) } } // 然后在导航控制器里设置 override func viewDidLoad() { super.viewDidLoad() let navBarColor = UIColor.white // 替换成你的自定义颜色 navigationBar.backgroundColor = navBarColor navigationBar.shadowImage = UIImage() navigationBar.setBackgroundImage(UIImage(color: navBarColor), for: .default) }
方法三:iOS 13+ 推荐的新API方案
iOS 13之后苹果引入了UINavigationBarAppearance,用这个方法更规范,还能适配滚动时的导航栏样式:
Swift 版本
override func viewDidLoad() { super.viewDidLoad() if #available(iOS 13.0, *) { let appearance = UINavigationBarAppearance() // 将阴影颜色设为透明,直接移除线条 appearance.shadowColor = .clear // 如果你需要自定义背景色,也可以在这里设置 // appearance.backgroundColor = .white // 应用到导航栏的两种外观模式 navigationBar.standardAppearance = appearance navigationBar.scrollEdgeAppearance = appearance } else { // 兼容iOS13以下的版本,用方法一的代码 navigationBar.shadowImage = UIImage() navigationBar.setBackgroundImage(UIImage(), for: .default) } }
注意事项
- 确保代码写在自定义导航控制器的生命周期方法里(比如
viewDidLoad或viewWillAppear),不要在子控制器里设置,避免被系统默认样式覆盖。 - 如果你的导航栏是半透明的,设置
shadowImage为空依然有效,不会影响半透明效果。
内容的提问来源于stack exchange,提问作者Faizul Karim
相关产品推荐
相关产品推荐

