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

Swift中为left/rightBarButtonItem设置不同tintColor的方法

问题根因

你遇到的按钮颜色不生效问题核心有两点:

  1. 你在viewWillDisappear中全局设置的navigationController?.navigationBar.tintColor = .blue是导航栏原生栏按钮的默认着色配置,在iOS 13+系统中,非自定义视图实现的UIBarButtonItem的tintColor属性优先级低于导航栏全局外观配置,会被全局值覆盖。
  2. iOS 15之后引入的UINavigationBarAppearance机制会统一接管导航栏原生按钮的外观渲染,单独给原生UIBarButtonItem设置tintColor不会触发外观刷新,自然不会生效。

你现有的导航栏还原逻辑不需要修改,只需要调整自定义按钮的实现方式即可实现左右按钮异色效果,对现有架构无侵入。

可行解决方案

最稳妥、兼容所有iOS版本的方案是用customView包装按钮实现自定义项,自定义视图的渲染优先级最高,不会被导航栏全局tint或外观配置覆盖:

// 右侧黑色功能按钮实现
let rightCustomBtn = UIButton(type: .system)
// 按需设置按钮图标、标题
// rightCustomBtn.setImage(UIImage(named: "notification_icon"), for: .normal)
rightCustomBtn.tintColor = .black
rightCustomBtn.accessibilityIdentifier = "navbar_notificationbutton"
// 绑定点击事件
rightCustomBtn.addTarget(self, action: #selector(notificationAction), for: .touchUpInside)
// 按需设置按钮尺寸,避免布局错位
rightCustomBtn.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: rightCustomBtn)

左侧按钮如果是系统默认返回按钮,会自动跟随你全局设置的蓝色tint,不需要额外修改;如果左侧也是自定义按钮,同理用customView方式初始化即可设置任意颜色。

注意事项

  • 不需要修改你之前写在viewWillDisappear中的导航栏还原代码,自定义按钮绑定在当前页面的navigationItem上,页面退出后会自动释放,不会污染其他页面的导航栏样式。
  • 不推荐在viewDidAppear等生命周期方法里反复修改全局navigationBar.tintColor实现异色,这种方式在页面转场时很容易出现颜色闪烁的问题。
效果对比

实际运行效果:
实际运行效果

预期效果:
预期效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:57:19