当用户切换到深色模式时,无法更新 UINavigationBar 色调颜色



在我的应用程序中,有两个主题:浅色主题和深色主题(都是自定义的(。它们分别在一个名为LightTheme和DarkTheme的类中定义,并且都符合ThemeProtocol,该协议只是为每个方面定义颜色。一个名为ThemeManager的类处理主题和特定颜色的切换/设置。当用户从亮模式更改为暗模式或从暗模式更改为亮模式时,设置视图控制器调用名为updateColors()的方法来反映切换到暗模式或亮模式。一切都很好——背景颜色会像其他视图一样通过updateColors()方法进行更新。唯一无法更新颜色的元素是导航栏。这会导致导航栏中的项目与背景颜色相同。

private func updateColors() {
// other colors are changed here, works fine
// changing the color does not work; icons are still the color they were before
self.navigationController?.navigationBar.tintColor = UIColor.blue
}

这个答案对我不起作用,因为我已经在使用答案的方法来更新导航颜色。

值得一提的是,我在根视图控制器中这样配置导航栏:

let backImage = NewImages.backArrow?.withRenderingMode(.alwaysOriginal).withAlignmentRectInsets(UIEdgeInsets(top: 0, left: -Padding.intermediate, bottom: 0, right: 0))
self.navigationController?.navigationBar.backIndicatorImage = backImage
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = backImage
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

let settingsImage = NewImages.settings?.withRenderingMode(.alwaysOriginal).withAlignmentRectInsets(UIEdgeInsets(top: 0, left: Padding.intermediate, bottom: 0, right: 0))
self.navigationItem.rightBarButtonItem = UIBarButtonItem(image: settingsImage, style: .done, target: self, action: #selector(self.settingsButtonClicked))
self.navigationItem.rightBarButtonItem?.imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: Padding.intermediate)

self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationController?.navigationBar.shadowImage = UIImage()

上面的代码设置了一个后退按钮和一个转到设置视图控制器的按钮。导航栏的背景也设置为空图像,使背景颜色清晰。

经过一两个小时对不同的代码组合的摆弄,结果发现这是一个非常小的错误。在将代码复制并粘贴到我的问题中时,我意识到了这个问题。我回答自己的问题是为了帮助其他和我有同样问题的人

在我的Assets.xcassets文件夹中,我的图像被设置为渲染为模板图像,这样我就不必为每个主题导入不同颜色的图像——我只需更改tintColor即可反映我想要的颜色。我的问题在于这两行(对于我的每个图像资产,NewImages只是一个具有UIImage类型属性的结构(:

let backImage = NewImages.backArrow?.withRenderingMode(.alwaysOriginal).withAlignmentRectInsets(UIEdgeInsets(top: 0, left: -Padding.intermediate, bottom: 0, right: 0))
let settingsImage = NewImages.settings?.withRenderingMode(.alwaysOriginal).withAlignmentRectInsets(UIEdgeInsets(top: 0, left: Padding.intermediate, bottom: 0, right: 0))

如您所见,这些图像的渲染模式设置为.alwaysOriginal。我把它改为.alwaysTemplate,问题就解决了。

最新更新