ios - xcode - iOS 11以下命名颜色的兼容性

64 1

我需要在运行于iOS 8 的iOS应用中实现dark模式,另外,在颜色资产中用rgb代码定义了light和dark两种颜色。

问题是在iOS 11之前不支持命名颜色,但是我只能使用命名颜色来同时支持深色和浅色两种外观。

有没有办法实现向后兼容性?

时间: 原作者:

68 4

在使用颜色资产时不能这样做,不过,你可以创建自己的ThemeManger来处理应用程序的主题。

首先创建一个ThemeManager .它的主要目的是保存应用程序的style


class ThemeManager {



 static let shared: ThemeManager = ThemeManager()



 var style: ThemeStyle = .light 


}



这里ThemeStyle应该是包含主题的枚举(浅色,深色等等)。

创建一个


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函数获取所需颜色,注意,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()




  • 要完成这项工作,你需要根据用户的ios首选项更新style中的ThemeManger变量,你可以通过 traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {在UIViewController类中实现此方法。
  • 就像backgroundColor例子一样,你需要定义所有颜色,这些颜色都受主题变化的影响,
  • styleThemeManger设置为首选的style

如果你的用户不能在light和dark中单独更改应用程序的主题,那么你,只需定义一个defaultColor值,如果不是ios 13,则返回它,对于运行iOS 12或更低版本的设备,这会使你的应用以它默认主题显示。

原作者:
...