You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除自定义导航栏中的黑色线条?我已在自定义导航控制器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:14:25