简介
2018年苹果在macOS系统引入了暗黑模式,一经推出广受好评。尤其是我们程序员,经常与代码、文本打交道,亮色风格的界面看久了,眼睛会特别累。有了暗黑模式之后,我们的眼睛终于能被温柔对待了。而且系统内置的应用适配的非常好,拿我们常用的XCode来说,也挑不出什么大毛病。反正我是用了暗黑模式之后就没有回去过了。
当然推出暗黑模式不只是为了程序员准备的,也有其他的原因:
- 可以当做夜间模式:晚上看屏幕的时候,不会亮到你睁不开眼睛。
- 信息重点的表达需要:在黑色系更能突出关键信息,能做到一目了然,抓住用户的焦点。
- 用户审美的需要:有相当多的用户对黑色系的产品很钟爱,当然要迎合他们的需求了。
- 硬件设备省电的需要:现在流行的OLED屏幕,对于纯黑色像素点是不需要通电的。
其实不管它有多少原因,苹果爸爸这么大力的推广,肯定有它的价值,我们跟着苹果爸爸走的就行。这不iOS13就引入到了iOS系统,对于我们开发者来说,就是又爱又恨啊。如果你们的产品是有格调的产品,多半暗黑模式适配的需求就在路上了,就像我一样?。但是最尴尬的地方在于,适配暗黑模式的api只在iOS13可用,你又要让我适配暗黑模式,又要让我最低支持iOS9,你这不是让我为难吗??没办法系统原生支持不了的,那就到咱们的宝藏网站Github上面找一找iOS9+的换肤方案。当然找到了许多,大部分是OC的,因为项目主要语言是Swift,所以pass掉。找到了许多swift三方库,但是里面的一些设计有点过时、有些不支持swift5、有些功能太重了。我只想要一个轻量级、高度自定义的方案即可。没有现成的满足的库,与其委曲求全,不如自己实现。所以就有了JXTheme
方案,一个轻量级、api友好、高度自定义的换肤方案。
该方案主要借鉴了iOS13的暗黑模式适配API,所以建议你先去网上查阅iOS13的暗黑模式适配指南。先对系统的方案有一定了解,再来看JXTheme
你会感到非常亲切。关键在于JXTheme
最低支持iOS9,等于说在iOS9就能使用iOS13的暗黑模式适配方案。而且后面还给出了当你的应用最低支持iOS13时,从JXTheme
切换到系统API的指南。
Github地址
大家可以先进入github地址,看一下效果。JXTheme Github地址
核心代码&关键流程介绍
下面按照换肤API的调用流程来介绍实现方案
1.如何优雅的设置主题属性
通过给控件扩展命名空间属性theme
,类似于SnapKit
的snp
、Kingfisher
的kf
,这样可以将支持主题修改的属性,集中到theme
属性。这样比直接给控件扩展属性theme_backgroundColor
更加优雅。
核心代码如下:
view.theme.backgroundColor = ThemeProvider({ (style) in
if style == .dark {
return .white
}else {
return .black
}
})
2.如何根据传入的style配置对应的值
借鉴iOS13系统APIUIColor(dynamicProvider: <UITraitCollection) -> UIColor>)
。自定义ThemeProvider
结构体,初始化器为init(_ provider: @escaping ThemePropertyProvider<T>)
。传入的参数ThemePropertyProvider
是一个闭包,定义为