返回

Swift中适配黑夜模式的优雅方式

IOS

优雅地为 iOS 应用程序实现动态颜色

在 iOS 13 及更高版本中,UIColor 类提供了 resolvedColor(with traitCollection: UITraitCollection?) -> UIColor 方法,可创建动态颜色。动态颜色根据设备的外观模式(明暗模式)自动调整颜色,确保应用程序在任何模式下都具有出色的视觉效果。

传统方法

传统上,使用以下代码创建动态颜色:

if #available(iOS 13.0, *) {
    let dynamicColor = UIColor { traitCollection in
        if traitCollection.userInterfaceStyle == .dark {
            return .black
        } else {
            return .white
        }
    }
} else {
    // iOS 13 之前的版本不支持动态颜色
}

这种方法需要判断 iOS 版本,代码冗长且难以维护。

优雅的方法

为了避免判断 iOS 版本,我们可以使用以下优雅方法:

extension UIColor {
    static var dynamicBlack: UIColor {
        if #available(iOS 13.0, *) {
            return .black
        } else {
            return .black
        }
    }
    
    static var dynamicWhite: UIColor {
        if #available(iOS 13.0, *) {
            return .white
        } else {
            return .white
        }
    }
}

使用动态颜色:

let dynamicColor = UIColor.dynamicBlack

这种方法简洁、易维护,无需判断 iOS 版本。

通用函数

更进一步,我们可以创建一个通用的函数来处理动态颜色:

func dynamicColor(lightColor: UIColor, darkColor: UIColor) -> UIColor {
    if #available(iOS 13.0, *) {
        return UIColor { traitCollection in
            if traitCollection.userInterfaceStyle == .dark {
                return darkColor
            } else {
                return lightColor
            }
        }
    } else {
        return lightColor
    }
}

使用通用函数:

let dynamicColor = dynamicColor(lightColor: .white, darkColor: .black)

优点

优雅方法的优点:

  • 无需判断 iOS 版本,简化代码
  • 维护性好,保持代码简洁
  • 确保应用程序在所有模式下都具有出色的视觉体验

结论

本文介绍的优雅方法为在 Swift 应用程序中实施动态颜色提供了便捷、简洁和灵活的方式。通过使用动态颜色,我们可以创建对外观模式变化做出响应且在任何模式下都美观的应用程序。

常见问题解答

1. 如何判断设备当前的外观模式?

可以使用 traitCollection.userInterfaceStyle 属性判断设备当前的外观模式。

2. 动态颜色在 iOS 13 之前的版本中有什么区别?

在 iOS 13 之前的版本中,不支持动态颜色,应用程序必须针对特定的外观模式创建静态颜色。

3. 除了明暗模式之外,动态颜色是否支持其他外观模式?

目前,动态颜色仅支持明暗模式。

4. 如何创建自定义动态颜色?

可以使用 dynamicColor(lightColor:, darkColor:) 函数创建自定义动态颜色,指定亮模式下的颜色和暗模式下的颜色。

5. 动态颜色是否影响应用程序的性能?

创建和使用动态颜色不会对应用程序的性能产生显著影响。