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

如何修改UINavigationBar的分隔线颜色?

嘿,这个问题我之前做Master-Detail项目的时候也踩过坑!你之前改backgroundColor没用是因为这两条线根本不是导航栏背景的一部分——竖屏时的是导航栏的阴影层,横屏时的是UISplitViewController自带的分隔元素,得针对性处理,我给你详细说下解决方案:

一、竖屏模式下修改导航栏底部的横向分隔线

这条线本质是UINavigationBar的系统阴影层,iOS默认会根据导航栏背景色自动生成,直接改背景色无法影响它,推荐用下面两种方式修改:

方法1:iOS 13+ 全局外观设置(更简洁)

可以把这段代码放在AppDelegate的didFinishLaunchingWithOptions里,或者根视图控制器的viewDidLoad中:

let navAppearance = UINavigationBarAppearance()
// 设置导航栏背景色(根据你的UI需求调整)
navAppearance.backgroundColor = .systemBackground
// 直接设置阴影颜色,这就是你要的分隔线颜色
navAppearance.shadowColor = .red
// 如果需要调整线的高度,也可以用自定义纯色图片替换shadowImage
// navAppearance.shadowImage = UIImage.colorImage(color: .red)

// 将外观应用到导航栏的所有状态(常规、滚动到顶部、紧凑模式)
UINavigationBar.appearance().standardAppearance = navAppearance
UINavigationBar.appearance().scrollEdgeAppearance = navAppearance
UINavigationBar.appearance().compactAppearance = navAppearance

方法2:兼容iOS 13以下的写法

先给UIImage写个扩展,用来生成纯色图片:

extension UIImage {
    static func colorImage(color: UIColor) -> UIImage {
        let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
        UIGraphicsBeginImageContext(rect.size)
        guard let context = UIGraphicsGetCurrentContext() else { return UIImage() }
        context.setFillColor(color.cgColor)
        context.fill(rect)
        let image = UIGraphicsGetImageFromCurrentImageContext() ?? UIImage()
        UIGraphicsEndImageContext()
        return image
    }
}

然后同时设置导航栏的backgroundImage和shadowImage(iOS默认要求这两个属性同时修改才会生效):

// 清除默认背景图片,也可以替换成你自定义的导航栏背景图
UINavigationBar.appearance().backgroundImage = UIImage()
// 设置阴影图片为你要的颜色
UINavigationBar.appearance().shadowImage = UIImage.colorImage(color: .red)

二、横屏模式下修改导航栏右侧的竖向分隔线

这条线是UISplitViewController自带的系统元素,无法直接通过系统API修改颜色,我们可以用自定义视图覆盖的方式解决:

方案1:全局添加竖分隔线(覆盖整个屏幕高度)

在你的自定义SplitViewController中添加以下代码:

class YourSplitViewController: UISplitViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // 创建1px宽的竖线视图
        let separatorView = UIView()
        separatorView.backgroundColor = .red // 设置你要的颜色
        separatorView.tag = 100 // 标记视图,方便后续更新布局
        separatorView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(separatorView)
        
        // 添加自动布局约束,让线始终贴在Master视图的右侧边缘
        NSLayoutConstraint.activate([
            separatorView.trailingAnchor.constraint(equalTo: view.leadingAnchor, constant: primaryColumnWidth),
            separatorView.topAnchor.constraint(equalTo: view.topAnchor),
            separatorView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            separatorView.widthAnchor.constraint(equalToConstant: 1)
        ])
        
        // 确保分隔线在最上层,不会被其他视图遮挡
        separatorView.layer.zPosition = CGFloat.greatestFiniteMagnitude
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        // 屏幕旋转时更新约束位置,适配Master视图宽度变化
        if let separatorView = view.subviews.first(where: { $0.tag == 100 }) {
            separatorView.trailingAnchor.constraint(equalTo: view.leadingAnchor, constant: primaryColumnWidth).isActive = true
        }
    }
}

方案2:仅在导航栏区域添加竖分隔线

如果觉得全局竖线太突兀,只想在导航栏右侧显示,可以在MasterViewController中添加代码:

class MasterViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        addNavigationSeparator()
    }
    
    private func addNavigationSeparator() {
        let separatorView = UIView()
        separatorView.backgroundColor = .red
        separatorView.tag = 101
        separatorView.translatesAutoresizingMaskIntoConstraints = false
        navigationController?.navigationBar.addSubview(separatorView)
        
        // 约束导航栏右侧的1px竖线
        NSLayoutConstraint.activate([
            separatorView.trailingAnchor.constraint(equalTo: navigationController!.navigationBar.trailingAnchor),
            separatorView.topAnchor.constraint(equalTo: navigationController!.navigationBar.topAnchor),
            separatorView.bottomAnchor.constraint(equalTo: navigationController!.navigationBar.bottomAnchor),
            separatorView.widthAnchor.constraint(equalToConstant: 1)
        ])
    }
}

内容的提问来源于stack exchange,提问作者ixany

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:33:31