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

iOS 26中UIBarButtonItem自定义视图无法正常着色的问题咨询

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 09:59:35