我需要在运行于iOS 8+的iOS应用中实现暗模式。另外,我在颜色资产中用RGB代码定义了自定义颜色,以实现浅色和深色外观。
在iOS 11之前不支持命名颜色的问题,但是我只能使用命名颜色来支持两种外观-深色和浅色。
有什么方法可以实现向后兼容?
我需要在运行于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
的{{1}}值设置为您首选的ThemeManger
,以便在未在iOS 13上运行时以默认主题打开您的应用。 修改:如果您的用户无法从应用本身内部更改应用的主题,那么您就不需要style
和{{1} } light
中的UIColor值。只需定义一个dark
值,然后在ThemeColor
函数的末尾返回即可。对于运行iOS 12或更低版本的设备,这将使您的应用以其默认主题显示。