Swift中为left/rightBarButtonItem设置不同tintColor的方法
问题根因
你遇到的按钮颜色不生效问题核心有两点:
- 你在
viewWillDisappear中全局设置的navigationController?.navigationBar.tintColor = .blue是导航栏原生栏按钮的默认着色配置,在iOS 13+系统中,非自定义视图实现的UIBarButtonItem的tintColor属性优先级低于导航栏全局外观配置,会被全局值覆盖。 - 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
相关产品推荐
相关产品推荐

