FluentDarkModeKit 1.0.4

FluentDarkModeKit 1.0.4

Levin LiBei LiicodesignDaohan Chong 维护。



  • 微软公司

Fluent Dark Mode Kit

Carthage compatible

FluentDarkModeKit 在苹果官方深色模式发布之前设计和开发。它提供了一种机制,以支持 iOS 11+(包括 iOS 13)上的应用程序的深色模式。

特性

  • 支持 iOS 11+ 的深色模式
  • 应用程序内动态切换主题而无需重启
  • 简单的 API 设计,对现有代码影响最小

安装

要求

  • iOS 11.0+
  • Xcode 11.0+
  • Swift 5.0+
  • Git LFS

您可以使用 Homebrew 安装 Git LFS

brew install git-lfs

Carthage

要使用 Carthage 在您的 Xcode 项目中集成 FluentDarkModeKit,请在您的 Cartfile 中指定它。

github "microsoft/FluentDarkModeKit"

Swift 包管理器

在 Xcode 菜单中点击 "文件 -> Swift 包管理器 -> 添加包依赖...",并搜索 "https://github.com/microsoft/FluentDarkModeKit"

由于 Xcode 自带工具处理 Swift 包,如果通过 Homebrew 安装,则可能无法检测到 git-lfs。如果 Xcode 无法获取包,请运行以下命令创建符号链接:

ln -s /usr/local/bin/git-lfs $(xcode-select -p)/usr/bin/git-lfs

CocoaPods

要使用 CocoaPods 将 FluentDarkModeKit 集成到 Xcode 项目中,请在您的 Podfile 中指定它

pod "FluentDarkModeKit"

开始

如何设置 FluentDarkModeKit

要设置 FluentDarkModeKit,您首先需要调用以下方法。

let configuration = DMEnvironmentConfiguration()
configuration.themeChangeHandler = {
    print("theme changed")
}
configuration.windowThemeChangeHandler = { window in
    print("\(window) theme changed")
}
configuration.useImageAsset = false

DarkModeManager.setup(with: configuration)
DarkModeManager.register(with: UIApplication.shared)

如上代码示例所示,FluentDarkModeKit 中有 3 个可配置属性。

themeChangeHandler

这是应用级主题更改的回调。默认为 nil。

当通过 setOverrideTraitCollection(_:) 设置新主题或系统级主题更改(DMTraitCollection.overrideTraitCollection.userInterfaceStyle 设置为 .unspecific)时被调用。

windowThemeChangeHandler

这是窗口主题更改的回调。iOS 13+。默认为 nil。

每次窗口的 traitCollection.userInterfaceStyle 更改时都会调用。UIWindow 的 traitCollection.userInterfaceStyle 可以有多种原因发生变化

  1. 系统级主题更改(DMTraitCollection.overrideTraitCollection.userInterfaceStyle 和 UIWindow 的 overrideUserInterfaceStyle 都设置为 .unspecific)。
  2. setOverrideTraitCollection(_:) 被调用(UIWindow 的 overrideUserInterfaceStyle 设置为 .unspecific)。
  3. UIWindow 的 overrideUserInterfaceStyle 被手动修改为与当前模式不同的值。
  4. UIKit 修改了您的 UIWindow 的 traitCollection(例如,当应用进入后台时,UIKit 会通过修改它来准备暗模式/浅模式的快照)。

useImageAsset

它用于确定是否使用 UIImageAsset 实例进行动态图像处理。iOS 13 或更高版本。默认值为 false。

当设置为 true 时,请不要使用标记有“保留矢量数据”的图像。

如何使用 FluentDarkModeKit

要使用 FluentDarkModeKit,请提供一对颜色或图像,而不是单个值。只需用亮色和暗色的颜色/图像对替换现有的颜色/图像。

颜色

extension UIColor {
    init(_ namespace: DMNamespace, light: UIColor, dark: UIColor)
    init(_ namespace: DMNamespace, dynamicProvider: @escaping (DMTraitCollection) -> UIColor)
}

let color1 = UIColor(.dm, light: .white, dark: .black)
let color2 = UIColor(.dm) { traitCollection in
    return traitCollection.userInterfaceStyle == .dark ? UIColor.black : UIColor.white
}

图像

extension UIImage {
    init(_ namespace: DMNamespace, light: UIImage, dark: UIImage)
}

let lightImage = UIImage(named: "Light")!
let darkImage = UIImage(named: "Dark")!
let image = UIImage(.dm, light: lightImage, dark: darkImage)

更改主题

DMTraitCollection.setOverride(DMTraitCollection(userInterfaceStyle: .light), animated: true) // Change to light theme with animation
DMTraitCollection.setOverride(DMTraitCollection(userInterfaceStyle: .unspecified), animated: true) // Change to "follow system" theme

其他

在更复杂的场景中,FluentDarkModeKit 与 iOS 13 中苹果的做法相似(有一些小的差异)。它维护一个全局的 DMTraitCollection,可以在自定义布局期间通过 DMTraitCollection.current 访问。

有关应在布局期间处理的案例的更多信息,请参阅 苹果的文档

当主题更改时,FluentDarkModeKit 将通过调用以下代理方法来通知当前窗口中的视图或视图控制器。

protocol DMTraitEnvironment: NSObjectProtocol {
    func dmTraitCollectionDidChange(_ previousTraitCollection: DMTraitCollection?)
}

迁移

如果您正在使用低于0.5.2的版本,并希望迁移到新版本,以下是一些您需要注意的变更

  1. 在iOS 13上,FluentDarkModeKit的最新版本使用iOS 13的API进行动态颜色和主题更改。
  2. 有一些API变更,请参阅如何设置FluentDarkModeKit更改主题

在更新FluentDarkModeKit后,仔细测试您的应用程序,并修复编译错误/警告。

贡献

此项目欢迎贡献和建议。大多数贡献都需要您同意一份贡献者许可协议(CLA),声明您有权,并且实际上确实,授予我们的权利使用您的贡献。有关详细信息,请访问https://cla.opensource.microsoft.com

在您提交拉取请求时,一个CLA机器人将自动确定您是否需要提供CLA,并相应地装饰PR(例如,状态检查,评论)。只需遵循机器人提供的说明即可。您只需在整个使用我们的CLA的repo中进行一次操作。

此项目已采用Microsoft开源行为准则。有关更多信息,请参阅行为准则常见问题解答或联系[email protected],提出任何进一步的问题或评论。

许可

版权所有 ©微软公司。保留所有权利。

许可协议为MIT