iOS 26中UIBarButtonItem自定义视图无法正常着色的问题咨询
看起来你遇到的是iOS 26里导航栏/工具栏对自定义视图的样式强制覆盖问题,这是iOS 26的新行为导致的,不是你操作有误~
在iOS 26中,导航栏和工具栏会自动对UIBarButtonItem(customView:)里的自定义视图应用自身的tintColor配置,直接覆盖你之前给自定义视图设置的颜色——这就是为什么控件直接加到页面上显示正常,放到导航栏里就“丢色”的核心原因,只有UISwitch的onTintColor因为是独立的专属属性,没被这个机制影响。
下面是针对你用到的几种控件的具体解决方法,结合你的代码做了修改:
1. UIButton的修复
给按钮设置颜色时,直接在配置里指定前景色,同时禁用它的色调自动继承行为,避免被导航栏覆盖:
func createButton() -> UIButton { var cfg = UIButton.Configuration.plain() cfg.image = UIImage(systemName: "eye") // 直接在配置中设置前景色(控制图标颜色) cfg.baseForegroundColor = .systemRed let button = UIButton(configuration: cfg) // 禁用色调自动调整,防止导航栏覆盖自定义颜色 button.tintAdjustmentMode = .normal return button }
2. UISegmentedControl的修复
除了设置选中分段的颜色,还要给控件本身设置tintColor,同时禁用色调继承:
func createSegment() -> UISegmentedControl { let i1 = UIImage(systemName: "eye")! let i2 = UIImage(systemName: "eye")! let seg = UISegmentedControl(items: [i1, i2]) seg.selectedSegmentIndex = 0 seg.selectedSegmentTintColor = .systemYellow // 设置控件整体tintColor(控制未选中项的图标/文字颜色) seg.tintColor = .systemRed seg.tintAdjustmentMode = .normal return seg }
3. UISwitch的thumbTintColor修复
UISwitch的thumbTintColor会被导航栏布局后覆盖,需要在页面加载完成后重新设置一次:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 找到导航栏中的UISwitch,重新设置thumbTintColor if let switchView = navigationItem.rightBarButtonItems?.first(where: { $0.customView is UISwitch })?.customView as? UISwitch { switchView.thumbTintColor = .systemPink } }
额外提醒:不需要给带自定义视图的UIBarButtonItem本身设置tintColor,这个属性不会传递到内部的自定义视图上,直接给自定义视图设置颜色才是正确的方式。
如果测试后还是有异常,那可能是iOS 26的版本bug(毕竟是新系统),可以尝试给苹果提交反馈,但上面的方法已经能解决大部分场景的问题了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

