如何修改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
相关产品推荐
相关产品推荐

