iOS 深色模式的自定义提升背景颜色

问题描述 投票:0回答:2

在人机界面指南的暗模式部分,Apple 描述了当您使用系统背景时基本上有三种背景颜色 - 浅色、深色和深色提升(例如用于模态)。

有什么方法可以使用这种提升的样式来定制颜色吗?我的资源文件中有一个自定义背景颜色,其中包括浅色和深色模式,但对于提升的内容,它仍将使用深色模式颜色。

ios colors background-color ios-darkmode
2个回答
1
投票

感谢库尔特·雷维斯(Kurt Revis)指出我的这个。我可以使用 Swift 提供的特殊 UIColor 初始值设定项来完成此操作。唯一的缺点是这在界面生成器中不起作用(因为它没有烘焙到资产本身中),但在代码中这将完美工作:

class ElevatedColor: UIColor {
    convenience init(regular: UIColor, elevated: UIColor) {
        if #available(iOS 13.0, *) {
            self.init { (traitCollection: UITraitCollection) -> UIColor in
                let isElevated = (traitCollection.userInterfaceLevel == .elevated)
                return isElevated ? elevated : regular
            }
        } else {
            self.init(cgColor: regular.cgColor)
        }
    }
}

这使用

UIColor.init(dynamicProvider:)
。只要界面特征发生变化,iOS 就会调用提供的块,因此在切换到提升的上下文时颜色会自动更新。不幸的是,由于 UIColor 的工作方式,您只能使初始化程序成为方便的初始化程序,因此从技术上讲,您可以创建一个没有提升版本的 ElevatedColor,但对我来说这是可以接受的。


0
投票

接受的解决方案也将为浅色模式提供增强的颜色,因此也许为了遵循 Apple 指南,我们应该只为深色模式设置增强的颜色。

允许在扩展中提供方便的初始值设定项,因此您不必定义新类。

extension UIColor {
    convenience init(regular: UIColor, elevated: UIColor) {
        self.init { traitCollection in
            traitCollection.userInterfaceStyle == .dark && 
            traitCollection.userInterfaceLevel == .elevated ? elevated : regular
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.