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
可以有多种原因发生变化
- 系统级主题更改(
DMTraitCollection.overrideTraitCollection.userInterfaceStyle
和 UIWindow 的overrideUserInterfaceStyle
都设置为.unspecific
)。 setOverrideTraitCollection(_:)
被调用(UIWindow 的overrideUserInterfaceStyle
设置为.unspecific
)。- UIWindow 的
overrideUserInterfaceStyle
被手动修改为与当前模式不同的值。 - 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的版本,并希望迁移到新版本,以下是一些您需要注意的变更
- 在iOS 13上,FluentDarkModeKit的最新版本使用iOS 13的API进行动态颜色和主题更改。
- 有一些API变更,请参阅如何设置FluentDarkModeKit和更改主题。
在更新FluentDarkModeKit后,仔细测试您的应用程序,并修复编译错误/警告。
贡献
此项目欢迎贡献和建议。大多数贡献都需要您同意一份贡献者许可协议(CLA),声明您有权,并且实际上确实,授予我们的权利使用您的贡献。有关详细信息,请访问https://cla.opensource.microsoft.com。
在您提交拉取请求时,一个CLA机器人将自动确定您是否需要提供CLA,并相应地装饰PR(例如,状态检查,评论)。只需遵循机器人提供的说明即可。您只需在整个使用我们的CLA的repo中进行一次操作。
此项目已采用Microsoft开源行为准则。有关更多信息,请参阅行为准则常见问题解答或联系[email protected],提出任何进一步的问题或评论。
许可
版权所有 ©微软公司。保留所有权利。
许可协议为MIT。