iOS13:如何在资产目录中为提升的用户界面级别指定颜色

时间:2019-09-20 10:49:14

标签: uicolor ios13 uitraitcollection ios-darkmode

iOS 13带给我们UIUserInterfaceLevel,可以是.base.elevated。在暗模式下使用提升的水平时,系统似乎会自动调整提供给UIView的颜色。

但是,似乎没有办法手动在资产目录中手动指定.elevated颜色,是吗?

唯一的方法似乎是通过the new UIColor constructor

UIColor.init { (traits) -> UIColor in
   traits.userInterfaceLevel == .elevated ? UIColor(named: "myColor-elevated")! : UIColor(named: "myColor")!
}

2 个答案:

答案 0 :(得分:2)

据我所知,没有办法使用颜色资产。

当您使用系统背景色和填充色时,iOS会在较高级别上自动选择“更高的颜色”,即.systemBackground变为.secondarySystemBackground,等等。

答案 1 :(得分:1)

我的解决方案是将 .xcassets 与这个 trait-dependent 初始化器结合起来。对于每种颜色,我创建了一个带有浅色和深色的颜色集,以及另一个仅包含提升颜色的颜色集(对于任何变体)。

然后我为 UIColor 添加了一个扩展。此扩展程序可让您轻松访问整个应用中的所有颜色,并包含选择正确颜色的逻辑。

extension UIColor {
    static let backgroundPrimary = UIColor { (trait) -> UIColor in
        switch (trait.userInterfaceStyle, trait.userInterfaceLevel) {
        case (.dark, .elevated):
            // For this color set you can set "Appearances" to "none"
            return UIColor(named: "backgroundPrimaryElevated") ?? .black
        default:
            // This color set has light and dark colors specified
            return UIColor(named: "backgroundPrimary") ?? .black
        }
    }
    // ... All the other colors
}