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

我需要在运行于iOS 8+的iOS应用中实现暗模式。另外,我在颜色资产中用RGB代码定义了自定义颜色,以实现浅色和深色外观。

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

有什么方法可以实现向后兼容?

jiangst 回答: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()

  • 要执行此操作,您需要根据用户对iOS 13设备的偏好,在style中更新ThemeManger变量。您可以通过traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)类中的UIViewController实现此方法来实现此目的。
  • 就像backgroundColor示例一样,您需要定义受主题更改影响的所有颜色。
  • style的{​​{1}}值设置为您首选的ThemeManger,以便在未在iOS 13上运行时以默认主题打开您的应用。

修改:如果您的用户无法从应用本身内部更改应用的主题,那么您就不需要style和{{1} } light中的UIColor值。只需定义一个dark值,然后在ThemeColor函数的末尾返回即可。对于运行iOS 12或更低版本的设备,这将使您的应用以其默认主题显示。

本文链接:https://www.f2er.com/2962513.html

大家都在问