iOS暗黑模式--UIColor

iOS 13系统的问世,开启了App的深色模式的大门。2002年3月4日更新的AppStore审核指南提出:从2020年4月30日开始,所有提交至App Store的iPhone App都须使用iOS 13 SDK或更高版本来构建。之前也有听闻说如果应用不支持暗黑模式的将要被强制下架。目前,我提交的app直接设置了不支持暗黑模式,

if #available(iOS 13.0, *) { self.window?.overrideUserInterfaceStyle = .light } else { // Fallback on earlier versions }

但那是还没有收到一些强制性的要求,不过还是要有所准备。
我把iOS13系统提供的颜色做一个记录,方便以后在适配颜色的时候方便查看。这些颜色是会根据暗黑模式来改变。
目录:
一、暗黑模式须知
1、 UIUserInterfaceStyle(页面模式的枚举)
2、暗黑模式监听
3、获取当前模式
二、iOS 13新增 UIColor及效果图
1、 系统提供的动态颜色
2、 系统提供的动态颜色的视觉图
三、自定义不同模式下UIColor
1、系统提供创建动态颜色的方法
2、创建动态颜色
四、使用Assets.xcassets 里面New Color Set设置颜色(推荐
1、创建Color Set
2、创建设置名称和不同模式下的颜色
3、代码中使用
4、运行结果展示
我在iOS13 新API和出现的问题这一篇的末尾处也提到过,这里在提一下。
一、暗黑模式须知 1、 UIUserInterfaceStyle(页面模式的枚举)
@available(iOS 12.0, *) public enum UIUserInterfaceStyle : Int { ///未指定模式 case unspecified ///光亮模式 case light ///暗黑模式 case dark }

2、暗黑模式监听
///监听模式的变化 override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { super.traitCollectionDidChange(previousTraitCollection) if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) { //模式发生变化会回调这里 } }

3、获取当前模式
if self.traitCollection.userInterfaceStyle == .dark { // Dark print("是dark模式、。。。") } elseif self.traitCollection.userInterfaceStyle == .light { // Light print("是light模式、。。。") } else { //unspecified print("是unspecified模式、。。。") }

二、iOS 13新增 UIColor及效果图 1、 系统提供的动态颜色
lazy var colorSource: [UIColor] = { let source = [UIColor.label,// @available(iOS 13.0, *) UIColor.secondaryLabel,// @available(iOS 13.0, *) UIColor.tertiaryLabel,// @available(iOS 13.0, *) UIColor.quaternaryLabel,// @available(iOS 13.0, *) UIColor.link,// @available(iOS 13.0, *) UIColor.placeholderText,// @available(iOS 13.0, *) UIColor.separator,// @available(iOS 13.0, *) UIColor.opaqueSeparator,// @available(iOS 13.0, *) UIColor.systemBackground,// @available(iOS 13.0, *) UIColor.secondarySystemBackground,// @available(iOS 13.0, *) UIColor.tertiarySystemBackground,// @available(iOS 13.0, *) UIColor.systemGroupedBackground,// @available(iOS 13.0, *) UIColor.secondarySystemGroupedBackground,// @available(iOS 13.0, *) UIColor.tertiarySystemGroupedBackground,// @available(iOS 13.0, *) UIColor.systemFill,// @available(iOS 13.0, *) UIColor.secondarySystemFill,// @available(iOS 13.0, *) UIColor.tertiarySystemFill,// @available(iOS 13.0, *) UIColor.quaternarySystemFill,// @available(iOS 13.0, *) UIColor.systemGray2,//@available(iOS 13.0, *) UIColor.systemGray3,//@available(iOS 13.0, *) UIColor.systemGray4,//@available(iOS 13.0, *) UIColor.systemGray5,//@available(iOS 13.0, *) UIColor.systemGray6,//@available(iOS 13.0, *) ] return source }()

2、 系统提供的动态颜色的视觉图 下图为我在不同模式下上面颜色的展示情况:

iOS暗黑模式--UIColor
文章图片
8463D019-8DEE-4BCB-B37E-0C6854C352B2.png iOS暗黑模式--UIColor
文章图片
346CD044-2F1D-421E-B85C-3DDDF3360395.png 注:我没有设置字体和字体的颜色,都是使用默认的。在dark模式向下所有的字体均变为了白色根据这个图,可以很方便的选择我们所需的颜色,如果没有达到要求,请使用下面的方法来自定义颜色。
三、自定义不同模式下UIColor 1、系统提供创建动态颜色的方法
extension UIColor {///根据不同的模式返回不同的颜色 @available(iOS 13.0, *) public init(dynamicProvider: @escaping (UITraitCollection) -> UIColor)/* Resolve any color to its most fundamental form (a non-dynamic color) for a specific trait collection. 根据已经设置的模式来返回颜色 */ @available(iOS 13.0, *) open func resolvedColor(with traitCollection: UITraitCollection) -> UIColor }

2、创建动态颜色
  • 此方法为如果是iOS13就返回系统提供的动态颜色
func lgl_color() -> UIColor { if #available(iOS 13.0, *) {//iOS13及以上 return UIColor.systemBackground//(这里修改iOS13<系统的动态颜色) } else {//iOS13以下的 return UIColor.red //(这里修改iOS13>系统的颜色) } }

  • 此方法为完全指定你想要的设置的颜色,是上个方法的升级版,使用到了
    public init(dynamicProvider: @escaping (UITraitCollection) -> UIColor)
func lgl_color2() -> UIColor { if #available(iOS 13.0, *) {//iOS13及以上 return UIColor(dynamicProvider: {(traitCollection) in switch traitCollection.userInterfaceStyle { case .light: return .brown case .dark: return .cyan case .unspecified: return .green @unknown default: return .brown } }) } else {//iOS13以下的 return UIColor.red } }

  • 以下方法是根据不同的模式来获取某个动态颜色所展示的颜色,使用到了
    open func resolvedColor(with traitCollection: UITraitCollection) -> UIColor
///获取labelColor在traitCollection模式下的展示的颜色 @available(iOS 13.0, *) func lgl_color3(_ labelColor: UIColor, _ traitCollection: UITraitCollection) -> UIColor { return labelColor.resolvedColor(with: traitCollection) }

四、使用Assets.xcassets 里面New Color Set设置颜色 在xcode9,iOS11及以后在Assets.xcassets里面新增了一个Color Set来设置颜色,用起来也是比较方便。
1、创建Color Set 创建方法如下图所示:

iOS暗黑模式--UIColor
文章图片
coloeSet1.png 2、创建设置名称和不同模式下的颜色 (在使用过程中Appearance选择 Any,Dark就可以)设置名称和颜色具体步骤如下图所示:

iOS暗黑模式--UIColor
文章图片
coloeSet2.png 3、代码中使用
let llView = UIView(frame: CGRect(x: 10, y: 100, width: 200, height: 200)) if #available(iOS 11.0, *) { llView.backgroundColor = UIColor(named: "lgl_test") } else { ///设置低于iOS11系统下展示的颜色 llView.backgroundColor = UIColor.red } self.view.addSubview(llView)

4、运行结果展示 iOS暗黑模式--UIColor
文章图片
59B09816-DDCD-40CF-9EA7-59D4829FD25E.png 注:在iOS13的系统下,如果没有设置模试,或者是设置成unspecified,展示跟Light Appearance同一颜色,低于iOS13系统下展示的就是 Any Appearance 所展示的颜色
【iOS暗黑模式--UIColor】以上就是对iOS13对于暗黑模式适配下,对于UIColor的一点记录,应该可以满足适配颜色的需求了

    推荐阅读