Bar Button Item Tint Color设置不生效,显示异常求助
我之前也碰到过类似的popover导航栏按钮颜色异常的情况,结合你的描述,给你几个针对性的排查和解决思路:
检查颜色设置的时机
你提到关闭重开popover后颜色恢复正常,这大概率是设置Tint Color的时机不对。如果是在viewDidLoad()里设置,可能此时popover的导航栏还没完全完成初始化渲染。建议把颜色设置代码移到viewDidAppear(_:)方法中,确保视图完全加载后再应用颜色设置,或者在popover弹出前就给对应的导航控制器设置颜色:// 在弹出popover前设置导航栏Tint Color let popoverVC = YourPopoverViewController() popoverVC.navigationController?.navigationBar.tintColor = .red present(popoverVC, animated: true)排查是否有自定义属性覆盖
有时候如果给Bar Button Item设置了titleTextAttributes,会直接覆盖Tint Color对文本颜色的控制。检查代码里有没有类似这样的设置:barButtonItem.setTitleAttributes([.foregroundColor: UIColor.black], for: .normal)如果有的话,要么移除这个设置(让文本颜色继承Tint Color),要么把颜色值改成对应Bar Button Item的Tint Color:
barButtonItem.setTitleAttributes([.foregroundColor: barButtonItem.tintColor], for: .normal)另外,如果使用了自定义的Bar Button Item子类,也要检查子类内部有没有硬编码文本颜色的逻辑。
强制刷新导航栏布局
UIKit偶尔会在popover这类弹窗的导航栏渲染上出现缓存或延迟问题,设置颜色后可以强制刷新布局,确保颜色生效:navigationBar.setNeedsLayout() navigationBar.layoutIfNeeded()全局外观设置的优先级验证
如果你用了UIBarButtonItem.appearance()或UINavigationBar.appearance()做全局设置,可能存在局部设置被全局覆盖的情况。可以尝试在popover的导航控制器内部单独设置,局部设置的优先级会高于全局外观设置。
内容的提问来源于stack exchange,提问作者Hans

