在我的应用程序中,有两个主题:轻型主题和黑暗主题(都是自定义的)。它们分别在一个名为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
}
This答案对我不起作用,因为我已经在使用答案的方法更新导航颜色。
值得一提的是,我在根视图控制器中配置了导航条,如下所示:
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()
上面的代码设置了一个后退按钮和一个按钮去设置视图控制器。导航栏的背景也被设置为空图像,使背景颜色变得清晰。
发布于 2020-09-12 11:50:16
经过一两个小时的反复修改不同的代码组合,结果发现这是一个非常小的错误。在将代码复制和粘贴到我的问题中时,我意识到了这个问题。我正在回答我自己的问题,以帮助那些和我有同样问题的人。
在我的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
,问题就解决了。
https://stackoverflow.com/questions/63864330
复制