2020的是被疫情覆盖的一年,在国内疫情得到控制之后,全国在4.4日举行了疫情哀悼纪念,而互联网的产物在那天也做出了很多默契的配合,比如说很多网站暂停运营一天,很多app网页的UI变成了黑白模式,那天我刷了一整天的手机看到的画面全是黑白的,第二天又调整为正常了.作为一个iOS开发,我思考如何才能更好的达到这种黑白与彩色之前的切换,想了以下几种思路:
通过查询资料,未找到方式1相关的api,iOS设备自身有个功能叫 颜色反转 ,有兴趣的可以去打开该功能看看,我在想这其实和实现黑白模式的原理是一样的,但是苹果未开放相关api
方式2看起来可行,我觉得一些app等在那天就是采用了这样的方式来实现的黑白化,因为app里的内容不是说有的都改成了黑白,只有部分图片或者页面改成了黑白模式,但是工作量有点太大了,而且不够灵活
方式3我认为是比较可靠可行的,于是我按照方式3的思路实现了UIColor及图片的黑白化
首先贴上一张没有开启黑白化的page原图,可以看到图片,color都是正常的
UIColor方法捕捉
我们注意以下这3处的颜色变化
在该方法中我们可以捕获到系统预设的systemColor,如果想知道到底有哪些systemColor,可以通过 [UIColor systemBlueColor]; 点击前往分类 @interface UIColor (UIColorSystemColors) 中,这里系统提供了许多预设的systemColor,这些方法与 initWithName:colorsByThemeKey: 中的name一致,所以我们拦截了所有的systemBlueColor方法,直接采用BlueColor返回,而BlueColor我们在前面也做过了拦截处理,这样就达到了统一处理,如果还有其他name类型的systemColor,可以采取同样的处理方式,或者我们可以将需要捕获的systemColor的name通过服务端下发,同时下发对应的r、g、b、a值,然后调用 [UIColor colorWithRed:r green:g blue:b alpha:a] 这样更加灵活
通常情况下,我们的app里的图片控件都会采用UIImageView,这里我只是正对 UIImageView 进行了 setImage 的hook,如果有其他情况,需要自己处理,掌握了此 黑白化 的技巧,其他的处理方式也差不多
图片的黑白化,我采用的是 CIFilter 滤镜实现,我们看下 黑白 和 单色 两种滤镜
效果差不多,但是在图片色彩丰富的图片上,个人认为Mono会比Noir效果好看点
至此,我们可以通过服务器来灵活配置关键参数 monochromatic ,开启或者关闭 黑白化 功能,实现app基本全面黑白化
demo参考