我需要在运行于iOS 8+的iOS应用中实现暗模式。另外,我在颜色资产中定义了具有RGB代码的自定义颜色,以实现明暗外观。
问题是在iOS 11之前不支持命名颜色,但是我只能使用命名颜色来支持两种外观-深色和浅色。
有什么方法可以实现向后兼容?
使用颜色资产时您不能这样做。但是,您可以创建自己的ThemeManger
来处理应用程序的主题。
首先创建一个ThemeManager
。主要目的是保留应用程序的style
。
class ThemeManager {
static let shared: ThemeManager = ThemeManager()
var style: ThemeStyle = .light
}
这里ThemeStyle
应该是包含您的主题(浅色,深色等)的枚举。
创建一个ThemeColor
类以处理您的颜色
class ThemeColor {
var dark: UIColor = UIColor.clear
var light: UIColor = UIColor.clear
var asset: String = ""
func getColor(for theme: ThemeStyle = ThemeManager.shared.style) -> UIColor {
if #available(iOS 13.0, *) {
if asset != "", let assetColor = UIColor(named: asset) {
return assetColor
}
}
if theme == .dark {
return dark
}
return light
}
}
您可以使用getColor
功能获得所需的颜色。请注意,ThemeColor
返回iOS 13的asset
颜色值。这用于在用户从设置更改其首选项时更改应用程序的主题。
示例:
extension UIColor {
class var backgroundColor: ThemeColor {
let themeColor = ThemeColor()
themeColor.light = UIColor.white
themeColor.dark = UIColor.black
themeColor.asset = "backgroundColor"
return themeColor
}
}
// Somewhere in your code set the backgroundColor of your view
myView.backgroundColor = UIColor.backgroundColor.getColor()
style
中更新ThemeManger
变量。您可以通过在traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
类中实现此方法的UIViewController
来执行此操作。backgroundColor
示例一样,您需要定义受主题更改影响的所有颜色。 style
的ThemeManger
值设置为首选style
,以便在未在iOS 13上运行时以默认主题打开应用程序。编辑:如果用户无法从应用程序本身内部更改应用程序的主题,则不需要light
中的dark
和ThemeColor
UIColor值。只需定义一个defaultColor
值,然后在getColor
函数的末尾返回即可。对于运行iOS 12或更低版本的设备,这将使您的应用以其默认主题显示。