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

问题描述 投票:4回答:1

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

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

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

ios xcode ios8 xcode11
1个回答
3
投票

使用颜色资产时您不能这样做。但是,您可以创建自己的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示例一样,您需要定义受主题更改影响的所有颜色。
  • styleThemeManger值设置为首选style,以便在未在iOS 13上运行时以默认主题打开应用程序。

编辑:如果用户无法从应用程序本身内部更改应用程序的主题,则不需要light中的darkThemeColor UIColor值。只需定义一个defaultColor值,然后在getColor函数的末尾返回即可。对于运行iOS 12或更低版本的设备,这将使您的应用以其默认主题显示。

© www.soinside.com 2019 - 2024. All rights reserved.